Ich möchte alle Ereignisdauern pro Tag summieren. Das ist mein Modell:Aggregierte gruppierte Annotation
class Event(models.Model):
start = models.DateTimeField()
end = models.DateTimeField()
Beispieldaten:
import datetime
from random import randint
for i in range(0, 1000):
start = datetime.datetime(
year=2016,
month=1,
day=randint(1, 10),
hour=randint(0, 23),
minute=randint(0, 59),
second=randint(0, 59)
)
end = start + datetime.timedelta(seconds=randint(30, 1000))
Event.objects.create(start=start, end=end)
ich die Veranstaltung pro Tag zählen wie so bekommen kann: (ich weiß extra
schlecht ist, aber ich bin mit 1,9 im Moment . aktualisieren, wenn ich ich werde mit TruncDate
) bewegen
Event.objects.extra({'date': 'date(start)'}).order_by('date').values('date').annotate(count=Count('id'))
[{'count': 131, 'date': datetime.date(2016, 1, 1)},
{'count': 95, 'date': datetime.date(2016, 1, 2)},
{'count': 99, 'date': datetime.date(2016, 1, 3)},
{'count': 85, 'date': datetime.date(2016, 1, 4)},
{'count': 87, 'date': datetime.date(2016, 1, 5)},
{'count': 94, 'date': datetime.date(2016, 1, 6)},
{'count': 97, 'date': datetime.date(2016, 1, 7)},
{'count': 111, 'date': datetime.date(2016, 1, 8)},
{'count': 97, 'date': datetime.date(2016, 1, 9)},
{'count': 104, 'date': datetime.date(2016, 1, 10)}]
I mit Anmerkungen versehen können die Dauer hinzuzufügen:
In [3]: Event.objects.annotate(duration=F('end') - F('start')).first().duration
Out[3]: datetime.timedelta(0, 470)
Aber ich kann nicht herausfinden, wie diese Annotation auf die gleiche Weise wie ich Ereignisse zählen kann. Ich habe folgendes versucht, aber ich bekomme eine KeyError
auf "Dauer".
Event.objects.annotate(duration=F('end') - F('start')).extra({'date': 'date(start)'}).order_by('date').values('date').annotate(total_duration=Sum('duration'))
und wenn ich hinzufügen duration
auf die values
Klausel dann nicht mehr Gruppen nach Datum.
Ist dies in einer einzigen Abfrage und ohne Hinzufügen eines Dauerfelds zum Modell möglich?
Wenn Sie 'Werte ('Datum') 'auf diesem Abfrage-Set verwenden, eliminieren Sie das Feld' Dauer ', sodass nichts zu summieren ist. Was passiert, wenn Sie nach dem Aufruf 'values ()' call und dann 'order_by ('date') '' duration '' hinzufügen? Oder ist es notwendig, 'values ()' überhaupt zu verwenden? – ChidG
Hey @ChidG! (Wie ist Ze'ev?) "Werte" wird für die Gruppe verwendet - ich denke, es ist erforderlich. Wenn ich dem Aufruf "values" die Option "duration" hinzufüge, versucht es, Ereignisse nicht nur mit "date", sondern mit "date" und "duration" zu gruppieren. –