django聚合或注释

时间:2012-01-05 13:41:29

标签: django aggregate annotate

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

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

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

4 个答案:

答案 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)

如果您只需要一个区域的事件总数,则不需要annotateaggregate,简单的count即可:

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

如果您想要多个区域的事件计数,则需要annotatevalues一起使用:

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,...)