2012-03-09 19 views
9

Sto lavorando con un modello simile ad articolo che ha un DateTimeField (auto_now_add = True) per acquisire la data di pubblicazione (pub_date). Questo sembra qualcosa di simile al seguente:Raggruppamento di voci di modello Django per giorno utilizzando il proprio campo datetime

voglio fare una query che conta come sono stati aggiunti molti messaggi di articoli o voci al giorno. In altre parole, voglio interrogare le voci e raggrupparle per giorno (e infine mese, ora, secondo, ecc.). Ciò sarebbe simile alla seguente nella shell SQLite:

select pub_date, count(id) from "myapp_article" 
where id = 1 
group by strftime("%d", pub_date) 
; 

che restituisce qualcosa di simile:

2012-03-07 18:08:57.456761|5 
2012-03-08 18:08:57.456761|9 
2012-03-09 18:08:57.456761|1 

io non riesco a capire come ottenere quel risultato da un Django QuerySet. Sono a conoscenza di come ottenere a similar result using itertools.groupby, ma ciò non è possibile in questa situazione (spiegazione da seguire).

Il risultato finale di questa query verrà utilizzato in un grafico che mostra il numero di messaggi al giorno. Sto tentando di utilizzare il pacchetto Django Chartit per raggiungere questo obiettivo. Chartit mette un vincolo sull'origine dati (DataPool). L'origine deve essere un Modello, Manager o QuerySet, quindi l'uso di itertools.groupby non è un'opzione per quanto posso dire.

Quindi la domanda è ... Come faccio a raggruppare o aggregare le voci per giorno e alla fine con un oggetto QuerySet?

risposta

31

creare un campo in più che solo i dati di data Store (non il tempo) e annotare con il conte:

Article.objects.extra({'published':"date(pub_date)"}).values('published').annotate(count=Count('id')) 

Risultato sarà:

published,count 
2012-03-07,5 
2012-03-08,9 
2012-03-09,1 
+0

cosa succede se vogliamo ottenere tutte le voci a parte conta per ogni pub_date nella stessa query? –

Problemi correlati