2010-08-02 11 views
7

Angenommen, ich habe ein solches Modell:Django Modellgruppe nach dem Datum der Datumzeit

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

Ich mag, dass sie als Liste von Listen neu zu formieren die jede Liste von Listen Entities vom gleichen Tag (am gleichen Tag enthält, Zeit sollte ignoriert werden).

Wie kann dies auf eine pythonische Weise erreicht werden?

Dank

+0

Mögliche Duplikate von [Django: Gruppieren nach Datum (Tag, Monat, Jahr)] (http://stackoverflow.com/questions/8746014/django-group-by-date-day-month-year) – tback

Antwort

11

Erstellen Sie eine kleine Funktion nur das Datum zu extrahieren:

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

Dann können Sie es mit itertools.groupby verwenden:

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)) 

Oder, wenn Sie wirklich eine Liste wollen Listen:

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

Es sei denn ich fehlt etwas, das nach Datum * und * Uhrzeit gruppiert, wenn OP nur nach Datum gruppieren möchte. Sie könnten sich für diesen Artikel interessieren: http://stackoverflow.com/questions/1236865/grouping-dates-in-django –

+0

@ Jordan Reiter: die Frage wurde bearbeitet. Ich habe die Antwort bearbeitet und jetzt funktioniert es wie OP will. – nosklo

+0

funktioniert gut, vielen Dank! – Hellnar

5

Ich bin mit der Antwort:

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

Aber es ist ein weiterer Punkt, dass: die Argumente von date() kombinieren die doppelt unterstreichen nicht foreign_key Feld verwenden können, Sie die table_name.field_name

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

und Produkt ist die table_name

Sie können aber auch "print result.query" verwenden, um die SQL in CMD zu sehen.

Verwandte Themen