Django aggregate или аннотировать
Это очень глупая вещь, я знаю, но я просто не понимаю, как манипулировать функциями и аннотациями Django.
У меня очень простой набор моделей: Events
, Areas
и Types
. Событие имеет внешние ключи, указывающие на Area
и Type
. Я просто хотел бы иметь количество предстоящих событий для любой области и того же для любого типа, то есть Area1 - 5 предстоящих событий, Area2 - 6 или Type1 - 34 событий и т.д.
Я хотел бы избежать написания собственного SQL и оператора q, если это возможно.
Ответы
Ответ 1
для данной области:
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
Ответ 2
Если вам просто нужно общее количество событий для одной области, вам не нужно либо annotate
, либо aggregate
, просто count
будет делать:
Event.objects.filter(area=my_area).count()
Если вы хотите подсчет событий для нескольких областей, вам нужно annotate
в сочетании с values
:
Event.objects.values('area').annotate(Count('area'))
Ответ 3
Спасибо всем. Проблема, с которой я столкнулась, задокументирована в последней версии, речь идет об аннотации и приоритете фильтра.
areas = Area.objects.filter(event__in = eventQuery).annotate(num=Count('event'))
Моя ошибка заключалась в том, что я сначала делал аннотацию и отфильтровывал второй.