Django Query: как мне найти максимальную продолжительность времени от начального и конечного поля времени?

Обновить

November 2018

Просмотры

288 раз

3

Вот моя модель 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)

Мне нужно найти работник, который провел максимальное количество времени, в офисе, в заданном диапазоне дат. Как рассчитать продолжительность времени от timeIn и поле таймаута в Django запросе?

Изменить: Я не хочу , чтобы использовать другой атрибут продолжительность , потому что кажется излишним. Есть ли другой способ сделать это , чем при использовании сырого запроса или атрибута продолжительности?

2 ответы

1

Джанго 1,10 появилась возможность изначально сделать даты / времени посмотреть различия через ORM. Этот запрос будет получить вам длинный сдвиг:

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().

0

Перебрать объекты и получить максимальную продолжительность между timeIn и таймаутом.

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

Связанные вопросы