11

この質問がまだ存在していないことに驚いています。もしそうなら、私がそれを見つけるのを手伝ってください。

annotate(Count)とorder_byを使用したいのですが、関連するオブジェクトのすべてのインスタンスをカウントするのではなく、特定の基準を満たすものだけをカウントします。

つまり、ツバメを持っている緑色のココナッツの数でリストするかもしれません。

swallow.objects.annotate(num_coconuts=Count('coconuts_carried__husk__color = "green"').order_by('num_coconuts')
4

2 に答える 2

13

Django >= 1.8 の場合:

from django.db.models import Sum, Case, When, IntegerField

swallow.objects.annotate(
    num_coconuts=Sum(Case(
        When(coconuts_carried__husk__color="green", then=1),
        output_field=IntegerField(),
    ))
).order_by('num_coconuts')
于 2016-11-09T21:58:39.547 に答える
9

これは正しい方法です。

swallow.objects.filter(
    coconuts_carried__husk__color="green"
).annotate(
    num_coconuts=Count('coconuts_carried')
).order_by('num_coconuts')

関連フィールドをフィルタリングすると、生の SQL では LEFT JOIN と WHERE として変換されることに注意してください。最終的に、注釈は、最初のフィルターから選択された関連行のみを含む結果セットに作用します。

于 2011-08-09T18:56:38.237 に答える