计算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中子查询的行数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Leetcode 234: Palindrome LinkedList(Leetcode 234:回文链接列表)
How do I read an Excel file directly from Dropbox#39;s API using pandas.read_excel()?(如何使用PANDAS.READ_EXCEL()直接从Dropbox的API读取Excel文件?)
subprocess.Popen tries to write to nonexistent pipe(子进程。打开尝试写入不存在的管道)
I want to realize Popen-code from Windows to Linux:(我想实现从Windows到Linux的POpen-code:)
Reading stdout from a subprocess in real time(实时读取子进程中的标准输出)
How to call type safely on a random file in Python?(如何在Python中安全地调用随机文件上的类型?)