1

ステータス=完了のすべての注文アイテムを含む注文を見つける必要があります。次のようになります。

FINISHED_STATUSES = [17,18,19]
if active_tab == 'outstanding':
    orders = orders.exclude(items__status__in=FINISHED_STATUSES)

ただし、このクエリでは、ステータスが完了した注文アイテムの注文のみが表示されます。完了ステータスのすべての注文アイテムを持つ注文のみを取得するようにクエリを実行するにはどうすればよいですか?

4

3 に答える 3

1

私はこれを一種のハック的な方法で行うことができました。まず、ブール列を追加しましたis_finished。次に、少なくとも1つの未完成品を含む注文を検索するには:

orders = orders.filter(items__status__is_finished=False)

これにより、すべての未完了の注文が発生します。

その逆を行うと、完成した注文が得られます。

orders = orders.exclude(items__status__is_finished=False)
于 2013-03-08T05:48:17.303 に答える
0

ブールフィールドを追加することは良い考えです。そうすれば、ビジネス ルールをモデルで明確に定義できます。

ここで、フィールドを追加せずにそれをやりたいとしましょう。これは、異なる一連の状況を考えると、非常によく要件となる可能性があります。残念ながら、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 を使用すると、洗練されていませんが、通常はより効率的であることに注意してください。

于 2013-03-08T14:58:46.223 に答える