【问题标题】:Django: filtering models on the difference of Counts of related modelsDjango:根据相关模型的计数差异过滤模型
【发布时间】:2009-12-08 10:03:05
【问题描述】:

我有一堆 Order 对象,每个对象都连接到一个或多个 OrderRow 对象(通过 Order.order_rows.all() 作为与其父 Orders 的反向关系可见)。

每个 OrderRow 都有一个 collection_status 属性,可以是 'collected'、'uncollected' 或一堆其他特殊值。每个订单都有一个 status 属性,其中一个有效值是“处理中”。

我在尝试构建一个列出具有以下条件的 Order 对象的 Order QuerySet 时不知所措:订单状态为“处理中”,其collection_status='collected' OrderRows 的计数小于其 OrderRows 的总数。即完全未取货或部分取货但未全部取货的订单。

明确地说:

包含两行的订单,均为“未收集”:包含在 QS
三行的订单,一列“已收集”,两列“未收集”:包含在 QS
包含两行的订单,均“已收集”:未包含在 QS 中!

(您可以将“未收集”替换为任何其他未“收集”的值,并且条件仍然相同;它是“收集”与任何其他收集状态)

我已经做到了 Order.objects.filter(status__exact='processing'),但除此之外,我在注释、Q() 对象等方面的所有尝试都失败了。

【问题讨论】:

  • 如果您选择的订单至少有一个“未收货”怎么办?那不是同一个意思吗? filter(order_rows__collection_status="uncollected")

标签: django django-models django-queryset


【解决方案1】:

我至少重读了 30 遍您的问题。让我看看我是否了解您的需求。

这不起作用,因为任何带有 OrderRow.collection_status=='collected' 的订单都会被排除在外

Order.objects.filter(status='processing').exclude(order_row__collection_status='collected')

让我们试试别的

orders=Order.objects.filter(status='processing')
arr=[]
for order in orders:
  col=order.order_rows.filter(collection_status='collected')
  if col.count() < order.order_rows.all().count():
    arr.append(order.pk)

orders=orders.filter(pk__in=arr)

澄清一下

其 collection_status='collected' OrderRows 的计数小于其 OrderRows 的总计数

在第 31 次阅读您的问题后,任何订单可能拥有的 OrderRows 总数似乎总是 >= 'collected' OrderRows 的数量

是否应该包含 29 行、14 行收集和 15 其他行的订单? 一个有 29 行、15 行已收集、14 行其他的订单呢?

【讨论】:

  • 我最终将查询拆分为两个操作,第一个使用原始 SQL 获取正确的订单 PK 集,另一个使用 pk__in 过滤器(如您所做的那样)从中构造一个 QuerySet .最终比在第一部分使用 QuerySet 更快。我只希望有一个优雅的单查询解决方案。至于您使用 29 行订单的最后一个问题:收集/未收集的比率是 14/15、15/14、1/28 还是 28/1 都没有关系。只要不是 29/0(全部收集),它就应该包含在查询集中。
猜你喜欢
  • 2018-03-01
  • 2017-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
  • 2020-01-19
  • 2020-12-21
  • 2019-08-11
相关资源
最近更新 更多