2012-04-14 44 views
21

Intento agrupar productos por DÍA, sin embargo, date_created es un campo de fecha y hora.Django ORM, agrupar por día

Product.objects.values('date_created') \ 
       .annotate(available=Count('available_quantity')) 

devuelve:

[ 
    {'date_created': datetime.datetime(2012, 4, 14, 13, 3, 6), 'available': 1}, 
    {'date_created': datetime.datetime(2012, 4, 14, 17, 12, 9), 'available': 1}, 
    ... 
] 

que quiero:

[ 
    {'date_created': datetime.datetime(2012, 4, 14), 'available': 2}, ... 
] 

edición: base de datos de motor MySQL

+0

día en lun/mar/miércoles ? –

+0

sí, quiero algo como [{'hoy': 17}, {'ayer': 21}, etc.] –

Respuesta

25

Inspirado por this question probar esto para MySQL

Product.objects.extra(select={'day': 'date(date_created)'}).values('day') \ 
       .annotate(available=Count('date_created')) 
+1

Esto fue útil pero tuve que borrar el orden predeterminado con un order_by() explícito entre los valores() y anotar(). Consulte https://docs.djangoproject.com/en/dev/topics/db/aggregation/#interaction-with-default-ordering-or-order-by. ¡Gracias! – somecallitblues

-1

En Django 1.4, se puede utilizar en lugar de .dates('date_created', 'day').values().

Prueba este fragmento de código:

Product.objects.annotate(available=Count('available_quantity')) \ 
    .dates('date_created', 'day') 

Este debe retorno:

[ 
    {'date_created': datetime.datetime(2012, 4, 14), 'available': 2}, ... 
] 
+0

suena cerca pero me sale una lista con fechas solamente: [datetime.datetime (2012, 4, 10, 0 , 0), datetime.datetime (2012, 4, 10, 0, 0), datetime.datetime (2012, 4, 10, 0, 0), datetime.datetime (2012, 4, 10, 0, 0)] –

+0

Pruebe .annotate() antes de crear DateQuerySet usando .dates. – cfedermann

+0

Lo intenté, ninguna diferencia –