ブールフィールドを追加することは良い考えです。そうすれば、ビジネス ルールをモデルで明確に定義できます。
ここで、フィールドを追加せずにそれをやりたいとしましょう。これは、異なる一連の状況を考えると、非常によく要件となる可能性があります。残念ながら、Django ORM ではサブクエリや任意の結合を実際に使用することはできません。Q
ただし、オブジェクトを構築し、 and を使用して、having 句で暗黙的な結合を作成することはできfilter()
ますannotate()
。
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 を使用すると、洗練されていませんが、通常はより効率的であることに注意してください。