Подтвердить что ты не робот

Django aggregate или аннотировать

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

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

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

4b9b3361

Ответ 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'))

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