Django:根据相关模型的计数差异过滤模型

时间:2009-12-08 10:03:05

标签: django django-models django-queryset

我有一堆Order对象,每个对象都连接到一个或多个OrderRow对象(与Order.order_rows.all()的父订单反向关联。)

每个OrderRow都有一个 collection_status 属性,可以“收集”,“取消收集”或一堆其他特殊值。每个订单都有一个状态属性,其中一个有效值是'处理'。

我无法尝试构建一个Order QuerySet,它列出了具有以下条件的Order对象:订单状态为'processing',其collection_status='collected' OrderRows的计数小于其OrderRows的总计数。没有收集或部分收集但未完全收集的订单,即。

以明确的方式表达:

两行订单,均为'未收集':包含在QS中 订单有三行,一行'收集',两行'未收集':包括在QS中 订单有两行,都是'收集':未包含在QS中!

(您可以将'未收集的'替换为任何其他未收集的值且标准仍然相同;它'收集'与任何其他collection_status相比)

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

1 个答案:

答案 0 :(得分:0)

我重读了你的问题至少30次。让我看看我是否理解你需要的东西。

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

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 ='已收集'的计数OrderRows小于其OrderRows的总数

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

是否应该包含29行,14行和15个其他订单? 29行,15集和其他14个订单怎么样?