Django按小时注释时间增量

Django按小时注释时间增量,django,django-views,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

我有一个模型如下:

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
数据如下:

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
如何总结时间增量,即结束时间-开始时间和分组时间,以显示每个人的工作时间,如下所示

person, hours
1 34:30
2 08:00

我不知道在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

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

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

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')

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

谢谢您的回复。这是一种方法。请注意,不能仅减去model.TimeField值。在执行此操作之前,必须转换为日期,例如datetime.datetime.combinework\u time.date、work\u time.end\u time-datetime.datetime.combinework\u time.date、work\u time.start\u time另一种方法是在模型/数据库中以秒为单位存储增量,然后对增量进行注释。有人知道如何在不将增量存储在数据库中的情况下对其进行注释吗?