考虑简单的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()
)))
aggregate
用法。您是否已经测试过此类查询?(我没有,我想相信!:)