Как отфильтровать объекты для подсчета комментариев в 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 имеет новыйУсловная агрегация особенность, см.принятый ответ ниже.