这是一件非常愚蠢的事情,我知道,但我似乎没有掌握 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'))
我的错误在于我先进行注释,然后再进行过滤。
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}]>