1日あたりのすべてのイベントの期間を合計したいと思います。これは私のモデルである:集計された集計注釈
class Event(models.Model):
start = models.DateTimeField()
end = models.DateTimeField()
サンプルデータ:
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)
私はそうのように一日あたりのイベント数を取得することができます (私はextra
が悪いですけど、私は、現時点では1.9を使用しています。私はTruncDate
を使用して移動しますアップグレード)
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)}]
私は期間を追加するために注釈を付けることができます。
In [3]: Event.objects.annotate(duration=F('end') - F('start')).first().duration
Out[3]: datetime.timedelta(0, 470)
しかし、私はイベントを数えるのと同じ方法でこの注釈を合計する方法を理解できません。私は以下を試しましたが、 'duration'にはKeyError
があります。
Event.objects.annotate(duration=F('end') - F('start')).extra({'date': 'date(start)'}).order_by('date').values('date').annotate(total_duration=Sum('duration'))
そして私は日付によって、その後values
句にもはやグループをduration
を追加した場合。
これは単一のクエリで可能ですが、期間フィールドをモデルに追加しないでください。
そのクエリセットで 'values( 'date')'を実行すると、 'duration'フィールドがなくなり、合計するものはありません。 'values()'呼び出しに 'duration'を追加した後に 'order_by( 'date')'を追加するとどうなりますか?あるいは、 'values()'を使う必要がありますか? – ChidG
ちょっと@ChidG! (Ze'evはどうですか?) 'values'はgroup_byに使われています - 私はそれが必要だと思います。 'duration'を' values'呼び出しに追加すると、 'date'だけでなく、' date'と 'duration'の両方でイベントをグループ化しようとします。 –