计算Django 1.11中子查询的行数

Count rows of a subquery in Django 1.11(计算Django 1.11中子查询的行数)

本文介绍了计算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'))

该查询的作用是:

  1. 将批次对象筛选为您已购买的对象
  2. 将退货批次分组到创建订单的用户中
  3. 注释/统计每个组的回复

这篇关于计算Django 1.11中子查询的行数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:计算Django 1.11中子查询的行数

基础教程推荐