这是一个非常愚蠢的事情,我知道,但我似乎没有得到Django聚合和注释函数的句柄。
我有一组非常简单的模型:Events
,Areas
和Types
。事件的外键指向Area
和Type
。我想简单地为任何区域提供即将发生的事件的数量,对于任何类型都是相同的,即 Area1 - 5即将发生的事件, Area2 - 6 或 Type1 - 34个事件等等。
我想避免编写自定义SQL,并尽可能使用q运算符。
答案 0 :(得分:15)
对于给定区域:
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
答案 1 :(得分:14)
如果您只需要一个区域的事件总数,则不需要annotate
或aggregate
,简单的count
即可:
Event.objects.filter(area=my_area).count()
如果您想要多个区域的事件计数,则需要annotate
与values
一起使用:
Event.objects.values('area').annotate(Count('area'))
答案 2 :(得分:0)
非常感谢你们。我遇到的问题记录在最后一个版本中,它是关于注释和过滤器优先级。
areas = Area.objects.filter(event__in = eventQuery).annotate(num=Count('event'))
我的错误在于我首先进行注释并过滤第二个。
答案 3 :(得分:0)
https://www.googleapis.com/auth/gmail.metadata
from django.db.models import Count
class Area(models.Model):
area_name = models.CharField(...)
address = models.CharField(...)
class Event(models.Model):
event_name = models.CharField(...)
area = models.ForeignKey(Area,...)