2010-08-02 28 views
7

Supongamos que tengo un modelo de este tipo:Django grupo de modelos por fecha de fecha y hora

class Entity(models.Model): 
    start_time = models.DateTimeField() 

Quiero reagruparlos como lista de listas la que cada lista de listas contiene entidades de la misma fecha (el mismo día, la hora debe ser ignorado).

¿Cómo se puede lograr esto de manera pitonica?

Gracias

+0

Posible duplicado de [Django: Agrupar por fecha (día, mes, año)] (http://stackoverflow.com/questions/8746014/django-group-by-date-day-month-year) – tback

Respuesta

11

crear una pequeña función para extraer sólo la fecha:

def extract_date(entity): 
    'extracts the starting date from an entity' 
    return entity.start_time.date() 

entonces usted puede utilizar con itertools.groupby:

from itertools import groupby 

entities = Entity.objects.order_by('start_time') 
for start_date, group in groupby(entities, key=extract_date): 
    do_something_with(start_date, list(group)) 

O, si realmente desea una lista de Listas:

entities = Entity.objects.order_by('start_time') 
list_of_lists = [list(g) for t, g in groupby(entities, key=extract_date)] 
+0

A menos que Me falta algo, que se agruparán por fecha * y * hora, cuando OP solo quiera agrupar por fecha. Puede que le interese este artículo: http://stackoverflow.com/questions/1236865/grouping-dates-in-django –

+0

@Jordan Reiter: la pregunta fue editada. He editado la respuesta y ahora funciona como OP quiere. – nosklo

+0

funciona bien, muchas gracias! – Hellnar

5

estoy de acuerdo con la respuesta:

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

Pero hay otro punto que: los argumentos de la fecha() no pueden utilizar el doble subrayado combinan campo foreign_key, usted tiene que utilizar el table_name.field_name

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

y el producto es el nombre_tabla

Además, puede utilizar "result.query de impresión" para ver el SQL en CMD.