2016-07-13 4 views
2

Wir haben eine Django-Anwendung mit einer Postgresql-Datenbank. Wir haben ein Modell, das eine DateTimeField() enthält.Wie man Elemente in Postgresql-Datenbank mit Django ORM von DateTimeField()

Wie zählen wir die Artikel stundenweise pro Tag? So, dass wir so etwas wie erhalten:

July 2, 2016, 4 p.m. | 10 
July 2, 2016, 5 p.m. | 12 
... 
July 3, 2016, 4 p.m. | 7 
July 3, 2016, 5 p.m. | 11 

# myapp/models.py 

class MyModel(models.Model): 
    my_date = models.DateTimeField() 

# myapp/views.py 

def object_count(): 
    query = MyModel.objects.how_to_count_items_by_hour_per_day 
+0

verknüpft ist, was Datenbank sind verwendest du? –

+0

Ich benutze Postgresql. –

Antwort

2

Django 1.10 neue Datenbank-Funktionen führt (Extract und Trunc):

from django.db.models import DateTimeField, Count 
from django.db.models.functions import Trunc 

MyModel.objects.annotate(
    day_hour=Trunc('my_date', 'hour', output_field=DateTimeField()) 
).values('day_hour').annotate(items=Count('id')) 
1

Versuchen mit:

MyModel.objects.values('my_date__date', 'my_date__hour').annotate(Count('id')) 
1

So , bis Django 1.10, dies schaut über den besten Weg zu sein:

jobs = MyModel.objects.filter(my_date__lte=datetime.now()).extra({"hour": "date_trunc('hour', my_date)"}).values(
     "hour").order_by('my_date').annotate(count=Count("id")) 

Der obige Code aus, dass modifiziert ist, die aus dem Blog wird, der unter der Gruppe von Stunde von der DateTimeField()

Django Aggregation: group by day