2012-01-05 17 views
11

To jest bardzo głupia rzecz, wiem, ale wydaje mi się, że nie rozumiem funkcji agregacji Django i adnotacji. Jest to bardzo prosty zestaw modeli: Events, Areas i Types. Zdarzenie ma klucze obce wskazujące na Area i Type. Chciałbym po prostu mieć liczbę nadchodzących zdarzeń dla dowolnego obszaru i tego samego dla dowolnego typu, tj. Area1 - 5 nadchodzących wydarzeń, Area2 - 6 lub Type1 - 34 events i tak dalej.agregacja django lub adnotacja

Chciałbym uniknąć pisania niestandardowego kodu SQL i operatora q, jeśli to możliwe.

+0

Czy przeczytałeś [dokumentację] (https://docs.djangoproject.com/en/dev/topics/db/aggregation/) i próbowałeś zaimplementować niektóre przykłady? –

+1

Pokaż swój kod, abyśmy mogli Ci pomóc w konkretnym problemie. – Marcin

Odpowiedz

10

Jeśli wystarczy łączną liczbę zdarzeń na jednym obszarze, nie trzeba albo annotate lub aggregate, prosty count zrobi:

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

Jeśli chcesz licznik zdarzeń dla wielu obszary, trzeba annotate w połączeniu z values:

Event.objects.values('area').annotate(Count('area')) 
0

Dziękuję wszystkim bardzo. Problem, który miałem, jest udokumentowany w ostatniej wersji, dotyczy to adnotacji i priorytetu filtrów.

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

Mój błąd polegał na tym, że robiłem najpierw adnotację i filtrowałem sekundę.

+0

Dla osób szukających tego w dokumentach ... [Kolejność opisów i filtrów] (https://docs.djangoproject.com/en/stable/topics/db/aggregation/#order-of-annotate-and- klauzule filtrujące) – alxs