2012-03-09 12 views
9

Estoy trabajando con un artículo como modelo que tiene un DateTimeField (auto_now_add = True) para capturar la fecha de publicación (pub_date). Esto se ve algo como lo siguiente:Agrupación de las entradas del modelo de Django por día usando su campo de fecha y hora

Quiero hacer una consulta lo que cuenta cómo se han añadido muchos puestos de artículos o entradas por día. En otras palabras, quiero consultar las entradas y agruparlas por día (y eventualmente por mes, hora, segundo, etc.). Esto sería algo como lo siguiente en el shell de SQLite:

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

que devuelve algo como:

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

Me parece que no puede encontrar la manera de conseguir que el resultado de un QuerySet Django. Soy consciente de cómo obtener a similar result using itertools.groupby, pero eso no es posible en esta situación (explicación a seguir).

El resultado final de esta consulta se utilizará en un gráfico que muestra el número de publicaciones por día. Estoy intentando usar el paquete Django Chartit para lograr este objetivo. Chartit pone una restricción en la fuente de datos (DataPool). La fuente debe ser un Model, Manager o QuerySet, por lo que el uso de itertools.groupby no es una opción por lo que puedo decir.

Entonces la pregunta es ... ¿Cómo puedo agrupar o agregar las entradas por día y terminar con un objeto QuerySet?

Respuesta

31

Crear un campo adicional que sólo los datos de fecha tienda (no el tiempo) y anotar con Count:

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

resultado será:

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

¿y si queremos obtener todas las entradas aparte de contar para cada pub_date en la misma consulta? –

Cuestiones relacionadas