17

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

我有一组非常简单的模型EventsAreasTypes。事件具有指向Area和的外键Type。我只想知道任何区域即将发生的事件的数量,并且任何类型的事件都相同,即Area1-5 即将发生的事件Area2-6Type1-34 事件等等。

如果可能,我想避免编写自定义 SQL 和 q 运算符。

4

4 回答 4

22

对于给定区域:

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

于 2012-01-05T13:59:27.077 回答
19

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

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

如果您想要多个区域的事件计数,则需要annotate结合values

Event.objects.values('area').annotate(Count('area'))
于 2012-01-05T13:58:29.847 回答
3

非常感谢大家。我遇到的问题记录在上一个版本中,它与注释和过滤优先级有关。

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

我的错误在于我先进行注释,然后再进行过滤。

于 2012-01-06T16:31:02.753 回答
0

给定模型 Event 和 Area 为:

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

为了获得每个区域的事件总数,您可以执行以下操作:

area_query = Area.objects.filter(yourfilter)
total_event_per_area = Event.objects.filter(area__in=area_query).values('area').annotate(Count('id'))
print(total_event_per_area)
<QuerySet [{'area': 2, 'id__count': 2}, {'area': 4, 'id__count': 3}]>
于 2019-09-11T08:56:47.477 回答