本文介绍了计算Django 1.11中子查询的行数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有几个型号
class Order(models.Model):
user = models.ForeignKey(User)
class Lot(models.Model):
order = models.ForeignKey(Order)
buyer = models.ForeignKey(User)
我尝试做的是用给定用户向同一卖家进行的多次购买来注释Lot
对象。(这不是一个错误,Order.user
实际上是一个卖家)。如"您最近从该用户购买了4件商品"。
我得到的最接近的是
recent_sold_lots = Lot.objects.filter(
order__user_id=OuterRef('order__user_id'),
status=Lot.STATUS_SOLD,
buyer_id=self.user_id,
date_sold__gte=now() - timedelta(hours=24),
)
qs = Lot.objects.filter(
status=Lot.STATUS_READY,
date_ready__lte=now() - timedelta(seconds=self.lag)
).annotate(same_user_recent_buys=Count(Subquery(recent_sold_lots.values('id'))))
但当Recent_Sold_Lats计数多于一个时失败:用作表达式的子查询返回的行多于一行。
.annotate(same_user_recent_buys=Subquery(recent_sold_lots.aggregate(Count('id')))
似乎也不起作用:此查询集包含对外部查询的引用,并且只能用于子查询。
.annotate(same_user_recent_buys=Subquery(recent_sold_lots.annotate(c=Count('id')).values('c'))
给我的表达式包含混合类型。您必须设置OUTPUT_FILDER.。如果我将output_field=models.IntegerField()
添加到子查询调用中,它将抛出由用作表达式的子查询返回的多行。
我被这个卡住了。我觉得我已经接近解决方案了,但我在这里错过了什么?
推荐答案
您在问题中定义的模型没有正确反映您正在进行的查询。在任何情况下,我都将使用该模型作为对查询的引用。
from django.db.models import Count
user_id = 123 # my user id and also the buyer
buyer = User.objects.get(pk=user_id)
Lot.objects.filter(buyer=buyer).values('order__user').annotate(unique_seller_order_count=Count('id'))
该查询的作用是:
- 将批次对象筛选为您已购买的对象
- 将退货批次分组到创建订单的用户中
- 注释/统计每个组的回复
这篇关于计算Django 1.11中子查询的行数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!