Джанго агрегат или аннотирование - PullRequest
13 голосов
/ 05 января 2012

Это очень глупая вещь, я знаю, но я просто не понимаю, как использовать функции агрегирования и аннотирования Django.

У меня очень простой набор моделей: Events, Areas и Types. У события есть внешние ключи, указывающие на Area и Type. Я просто хотел бы иметь количество предстоящих событий для любой области и одинаковое для любого типа, то есть Area1 - 5 предстоящих событий , Area2 - 6 или Type1 - 34 события и так далее.

Я бы хотел избежать написания собственного SQL и оператора q, если это возможно.

Ответы [ 3 ]

16 голосов
/ 05 января 2012

для данной области:

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

14 голосов
/ 05 января 2012

Если вам просто нужно общее количество событий для одной области, вам не нужно ни annotate, ни aggregate, просто count подойдет:

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

Если вы хотите подсчитать количество событий для нескольких областей, вам нужно annotate в сочетании с values:

Event.objects.values('area').annotate(Count('area'))
0 голосов
/ 06 января 2012

Спасибо всем большое. Проблема, с которой я столкнулся, описана в последней версии, речь идет о приоритете аннотирования и фильтрации.

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

Моя ошибка была в том, что я сначала делал аннотации, а затем фильтры.

...