Как отфильтровать объекты для подсчета комментариев в Django?

Рассмотрим простые модели DjangoEvent а также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.

Обновить. Джанго 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. Джанго 2.0 имеет новыйУсловная агрегация особенность, см.принятый ответ ниже.

Ответы на вопрос(4)

Ваш ответ на вопрос