Django按小时标注时间增量

时间:2014-10-15 11:01:36

标签: django django-views

我的模型如下:

class WorkTime(models.Model):
   person = models.ForeignKey(Person)
   entry_date = models.DateField(default=datetime.datetime.now(), verbose_name='date')
   start_time = models.TimeField(verbose_name='start')
   end_time = models.TimeField(verbose_name='end')

数据如下:

person, date, start, end
1 01/01/2014 08:00 12:00
1 01/01/2014 13:00 18:00
1 02/01/2014 08:00 12:00
1 02/01/2014 13:00 18:00
1 03/01/2014 08:00 16:00
1 01/02/2014 08:30 12:00
1 01/02/2014 13:00 18:00
2 01/01/2014 09:00 13:00
2 01/01/2014 14:00 18:00

如何总结时间增量(即end_time - start_time)和GROUP BY人来显示按人工作的小时数,如下所示?

person, hours
1 34:30
2 08:00

2 个答案:

答案 0 :(得分:0)

我不知道在ORM中做到这一点的好方法。通过迭代查询集来构建字典非常简单。

from collections import defaultdict
from datetime import datetime

totals = defaultdict()
work_times = WorkTime.objects.
for work_time in work_times:
    totals[work_time.person] += datetime.combine(work_time.entry_date, work_time.end_time) - datetime.combine(work_time.entry_date, work_time.start_time)

# print results
for person, total_time in totals.items():
    # total_time will be a timedelta, you can do some more work to return hours and minutes
    print person, total_time

根据您的使用情况,这可能足够好。

答案 1 :(得分:0)

这已经有一段时间了,但也许有人会偶然发现这一点。 你可以这样做:

from django.db.models import F, Sum
queryset = queryset.values('person').annotate(sum_delta=Sum(F('end_time')-F('start_time')).order_by('person__id')

这将总结每个人的所有时间增量,您不必在数据库中存储额外的东西。