2013-07-27 7 views
6

Ich suche nach einer schnellen Methode, um die Objekte des Modells, die innerhalb der letzten 30 Tage erstellt wurden, für jeden Tag separat zu zählen. Zum Beispiel:Erhalte Objekte, die in den letzten 30 Tagen für jeden vergangenen Tag erstellt wurden

27.07.2013 (today) - 3 objects created 
26.07.2013 - 0 objects created 
25.07.2013 - 2 objects created 
... 
27.06.2013 - 1 objects created 

Ich werde diese Daten in Google Charts API verwenden. Haben Sie eine Idee, wie Sie diese Daten effizient erhalten?

Antwort

17
items = Foo.objects.filter(createdate__lte=datetime.datetime.today(), createdate__gt=datetime.datetime.today()-datetime.timedelta(days=30)).\ 
    values('createdate').annotate(count=Count('id')) 

Dies wird (1) Ergebnis der letzten 30 Tagen enthalten, (2) wählen nur das ErstellDat Feld und (3) die ID der Zählung, durch alle ausgewählten Felder Gruppierung (d.h. ErstellDat). Dies wird eine Liste der Wörterbücher des Formats zurück:

[ 
    {'createdate': <datetime.date object>, 'count': <int>}, 
    {'createdate': <datetime.date object>, 'count': <int>}, 
    ... 
] 

EDIT:

Ich glaube nicht, gibt es eine Möglichkeit, alle Daten zu erhalten, auch solche mit count == 0, nur mit SQL. Sie müssen jedes fehlende Datum über den Python-Code eingeben, z. B .:

import datetime 

# needed to use .append() later on 
items = list(items) 

dates = [x.get('createdate') for x in items] 

for d in (datetime.datetime.today() - datetime.timedelta(days=x) for x in range(0,30)): 
    if d not in dates: 
     items.append({'createdate': d, 'count': 0}) 
+0

Es ist etwas, das ich gesucht habe. Ich möchte aber auch Daten angeben, bei denen die Anzahl der Objekte gleich 0 ist. Wie kann ich das tun? – dease

+0

@dease Ich habe meine Antwort aktualisiert, um zu zeigen, wie das geht. Ich änderte auch den ursprünglichen Code, um datefields anstatt datetimefields zu verwenden. – knbk

+0

wie danach bestellen? –

Verwandte Themen