2010-08-02 18 views
7

Si supponga che ho un tale modello:Django gruppo di modelli per data di datetime

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

voglio riorganizzarsi loro come lista di liste che ogni lista di liste contiene entità dalla stessa data (stesso giorno, tempo dovrebbe essere ignorato).

Come si può ottenere questo in modo pititico?

Grazie

+0

Possibile duplicato di [Django: Raggruppa per data (giorno, mese, anno)] (http://stackoverflow.com/questions/8746014/django-group-by-date-day-month-year) – tback

risposta

11

Creare una piccola funzione per estrarre solo la data:

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

Quindi è possibile utilizzare 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)) 

Oppure, se si vuole veramente un elenco di liste:

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

A meno che non Mi manca qualcosa, che raggrupperà per data * e * ora, quando OP vuole raggruppare solo per data. Potresti essere interessato a questo articolo: http://stackoverflow.com/questions/1236865/grouping-dates-in-django –

+0

@Jordan Reiter: la domanda è stata modificata. Ho modificato la risposta e ora funziona come vuole OP. – nosklo

+0

funziona bene, grazie mille! – Hellnar

5

sono d'accordo con la risposta:

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

Ma c'è un altro punto che: gli argomenti di data() non possono utilizzare la doppia sottolineatura campo combine foreign_key, è necessario utilizzare il table_name.field_name

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

e prodotto è il table_name

Inoltre, è possibile utilizzare "result.query di stampa" per vedere il codice SQL in CMD.

Problemi correlati