2012-01-05 10 views
11

Questa è una cosa molto stupida, lo so, ma non mi sembra che riesca a gestire le aggregazioni e le funzioni di annotazione di Django.django aggregate o annotazione

Ho un set di modelli molto semplice: Events, Areas e Types. Un evento ha chiavi esterne che puntano a Area e Type. Vorrei semplicemente avere il numero di eventi futuri per qualsiasi area e lo stesso per qualsiasi tipo, ovvero Area1 - 5 eventi futuri, Area2 - 6 o Tipo1 - 34 eventi e così via.

Vorrei evitare di scrivere SQL personalizzato e l'operatore q se possibile.

+0

Hai letto la [documentazione] (https://docs.djangoproject.com/en/dev/topics/db/aggregation/) e hai effettivamente provato ad implementare alcuni degli esempi? –

+1

Si prega di mostrare il codice, in modo che possiamo aiutarvi con un problema concreto. – Marcin

risposta

10

Se avete solo bisogno il numero totale di eventi per una singola area, non è necessario né annotate o aggregate, un semplice count farà:

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

Se si desidera che il numero di eventi per multiple aree, è necessario annotate in combinazione con values:

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

Grazie a tutti voi. Il problema che stavo avendo è documentato nell'ultima versione, riguarda l'annotazione e la precedenza del filtro.

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

Il mio errore era nel fatto che stavo facendo annotazione prima e filtro secondo.

+0

Per chi cerca questo nel documento ... [Ordine delle clausole di annotazione e filtro] (https://docs.djangoproject.com/it/stable/topics/db/aggregation/#order-of-annotate-and- filtro-clausole) – alxs