Django Query:如何从开始和结束时间字段中找到最长持续时间?

时间:2016-08-29 19:14:12

标签: sql django python-2.7 django-models django-queryset

这是我的Django模型:

class Shift(models.Model):
        worker = models.OneToOneField('Worker',null=True)
        date = models.DateField(null=True)
        shiftTime = models.CharField(max_length=10, default="N/A")
        timeIn = models.TimeField(null=True)
        timeOut = models.TimeField(null=True)

我需要找一个在给定日期范围内在办公室度过最多时间的工人。如何计算Django查询中timeIn和timeOut字段的持续时间?

修改:我不想使用其他属性持续时间,因为这似乎是多余的。除了使用原始查询或持续时间属性之外,还有其他方法吗?

2 个答案:

答案 0 :(得分:2)

Django 1.10通过ORM引入了natively do date/time diffs的能力。此查询将为您提供最长的转变:

from django.db.models import DurationField, ExpressionWrapper, F

longest_shift = Shift.objects.annotate(shift_length=ExpressionWrapper(
                                           F('timeOut') - F('timeIn'),
                                           output_field=DurationField()))\.
                                           order_by('-shift_length').first()

您可以根据需要为特定日期范围添加过滤器,方法是在filter()之前添加annotate()子句。

答案 1 :(得分:0)

遍历对象并获得timeIn和timeOut之间的最大持续时间。

def get_largest_time_diff():
    shift_objs = Shift.objects.all()
    time_diff = 0

    if shift_objs:
       time_diff = shift_objs[0].timeOut - shift_objs[0].timeIn

       for tm in shift_objs[1:]:
           if time_diff < tm.timeOut - tm.timeIn:
               time_diff = tm.timeOut - tm.timeIn

    return time_diff