django聚合或注释

问题描述 投票:12回答:3

这是一个非常愚蠢的事情,我知道,但我似乎没有得到Django聚合和注释函数的句柄。

我有一套非常简单的模型:EventsAreasTypes。一个事件的外键指向AreaType。我只想拥有任何区域的即将发生的事件的数量,并且对于任何类型都是相同的,即Area1-5即将发生的事件,Area2-6或Type1-34事件等等。

我想避免编写自定义SQL,并尽可能使用q运算符。

django aggregate annotate
3个回答
14
投票

对于给定区域:

my_area = Area.objects.all()[0]
Event.objects.filter(area=my_area).count()

注解

events = Event.objects.annotate(Count('area'))
for event in events:
    print event, event.area__count

要么

events = Event.objects.annotate(count=Count('area'))
for event in events:
    print event, event.count

请参阅以下文档:

https://docs.djangoproject.com/en/dev/ref/models/querysets/#annotate


14
投票

如果你只需要一个区域的事件总数,你不需要annotateaggregate,一个简单的count会:

Event.objects.filter(area=my_area).count()

如果你想要多个区域的事件计数,你需要annotatevalues

Event.objects.values('area').annotate(Count('area'))

0
投票

非常感谢你们。我遇到的问题记录在最后一个版本中,它是关于注释和过滤器优先级。

areas = Area.objects.filter(event__in = eventQuery).annotate(num=Count('event'))

我的错误在于我首先进行注释并过滤第二个。

© www.soinside.com 2019 - 2024. All rights reserved.