5
Djangoでcountアノテーションのオブジェクトをフィルタリングする方法は?
単純なDjangoモデルEventとParticipant: class Event(models.Model): title = models.CharField(max_length=100) class Participant(models.Model): event = models.ForeignKey(Event, db_index=True) is_paid = models.BooleanField(default=False, db_index=True) 参加者の総数でイベントクエリに注釈を付けるのは簡単です。 events = Event.objects.all().annotate(participants=models.Count('participant')) フィルタリングされた参加者の数を注釈する方法はis_paid=True? 参加者の数に関係なく、すべてのイベントをクエリする必要があります。たとえば、注釈付きの結果でフィルタリングする必要はありません。0参加者がいる場合は問題ありません0。注釈付きの値が必要です。 ドキュメントの例は、オブジェクトにで注釈を付ける代わりにクエリから除外するため、ここでは機能しません0。 更新。Django 1.8には新しい条件式機能が備わっているので、次のようにできます。 events = Event.objects.all().annotate(paid_participants=models.Sum( models.Case( models.When(participant__is_paid=True, then=1), default=0, output_field=models.IntegerField() ))) Update 2. Django 2.0には新しい条件付き集約機能があります。以下の承認済みの回答を参照してください。