相关疑难解决方法(0)

如何在Django中过滤count对注释的对象?

考虑简单的Django模型EventParticipant:

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)
Run Code Online (Sandbox Code Playgroud)

使用参与者总数来注释事件查询很容易:

events = Event.objects.all().annotate(participants=models.Count('participant'))
Run Code Online (Sandbox Code Playgroud)

如何用过滤的参与者数量进行注释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()
    )))
Run Code Online (Sandbox Code Playgroud)

更新2. Django 2.0具有新的条件聚合功能,请参阅下面接受的答案.

python django django-models django-aggregation

109
推荐指数
4
解决办法
4万
查看次数