添加布爾領域是一個好主意。這樣您就可以在模型中明確定義您的業務規則。
現在,假設您仍然希望這樣做,而不訴諸增加字段。鑑於不同的情況,這很可能是一個要求。不幸的是,你不能真正在Django ORM中使用子查詢或任意連接。但是,您可以構建Q
對象,並使用filter()
和annotate()
在having子句中進行隱式聯接。
from django.db.models.aggregates import Count
from django.db.models import Q
from functools import reduce
from operator import or_
total_items_by_orders = Orders.objects.annotate(
item_count=Count('items'))
finished_items_by_orders = Orders.objects.filter(
items__status__in=FINISHED_STATUSES).annotate(
item_count=Count('items'))
orders = total_items_by_orders.exclude(
reduce(or_, (Q(id=o.id, item_count=o.item_count)
for o in finished_items_by_orders)))
請注意,使用原始SQL雖然較不優雅,但通常效率更高。
我不確定爲什麼有人投票結束這個問題。我認爲它有好處。 – Brandon 2013-03-08 01:55:44