这是一个非常愚蠢的事情,我知道,但我似乎没有得到Django聚合和注释函数的句柄。
我有一套非常简单的模型:Events
,Areas
和Types
。一个事件的外键指向Area
和Type
。我只想拥有任何区域的即将发生的事件的数量,并且对于任何类型都是相同的,即Area1-5即将发生的事件,Area2-6或Type1-34事件等等。
我想避免编写自定义SQL,并尽可能使用q运算符。
对于给定区域:
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
如果你只需要一个区域的事件总数,你不需要annotate
或aggregate
,一个简单的count
会:
Event.objects.filter(area=my_area).count()
如果你想要多个区域的事件计数,你需要annotate
和values
:
Event.objects.values('area').annotate(Count('area'))
非常感谢你们。我遇到的问题记录在最后一个版本中,它是关于注释和过滤器优先级。
areas = Area.objects.filter(event__in = eventQuery).annotate(num=Count('event'))
我的错误在于我首先进行注释并过滤第二个。