シンプルな 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()
)))
更新 2. Django 2.0 には新しい条件付き集計機能があります。以下の受け入れられた回答を参照してください。
Update 3. Django 3.x については、以下の回答を確認してください。