考虑简单的 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()
)))