Django - как обрабатывать продолжительность времени

Я пытаюсь отобразить прошедшее время во время гонки.

class results(models.Model):
    race_id = models.ForeignKey(Race, on_delete=models.CASCADE)
    runner_id = models.ForeignKey(Runner, on_delete=models.CASCADE)
    race_start = models.DateTimeField()
    race_finish = models.DateTimeField(blank=True, null=True)
    obs = models.TextField(blank=True)
    def __str__(self):
        return self.race_id.race_cod+" - "+self.runner_id.name
    class Meta:
        verbose_name_plural = "Results"

Посмотрев здесь, я нашел следующие руководства:

Время, прошедшее между двумя DateTimeFields в модели Django

Django: какой тип поля лучше всего подходит для представляет прошедшее время?

К сожалению, представленное там решение кажется немного сложным.

Я также нашел этот обходной путь на странице просмотра .html.

<div class="info-box-content">
  <span class="info-box-number">Time - {{ results.race_finish|timesince:results.race_start }}</span>
</div>

проблема с этим заключается в том, что все, что превышает 24 часа, представлено как x дней, yy часов, а мне нужно отображать продолжительность как HH:mm

Любые подсказки здесь?


person Tizu    schedule 17.02.2020    source источник


Ответы (2)


Для этого я бы предложил добавить пользовательский фильтр шаблона или новое свойство модели. Например, если вы хотите добавить это в свою модель:

class results(models.Model):
    ...
    race_start = models.DateTimeField()
    race_finish = models.DateTimeField(blank=True, null=True)
    @property
    def duration(self):
        if not (self.race_start and self.race_finish): return None
        a,b=self.race_start, self.race_finish
        return '%s:%s' % ((b-a).days*24 + (b-a).seconds//3600, (b-a).seconds%3600//60)

Вот пример преобразования его в класс (вне django), чтобы показать, как он будет работать с двумя временами гонки, разделенными 1 днем, 2 часами, 17 минутами:

import datetime
class results:
    def __init__(self):
        self.race_start = datetime.datetime.now()
        self.race_finish = datetime.datetime.now() + datetime.timedelta(days=1, hours=2, minutes=17)
    @property
    def duration(self):
        if not (self.race_start and self.race_finish): return None
        a,b=self.race_start, self.race_finish
        return '%s:%s' % ((b-a).days*24 + (b-a).seconds//3600, (b-a).seconds%3600//60)

>>> r=results()
>>> r.duration
'26:17'

Другими словами, в вашем шаблоне у вас может быть просто Time - {{ results.duration }}, и он должен показывать: "Time - 26:17".

person David542    schedule 17.02.2020
comment
Отличное решение. Работает как шарм. Спасибо. - person Tizu; 25.02.2020

Вы пробовали использовать встроенные теги?

{{ value|time:"H:i" }}

https://docs.djangoproject.com/en/3.0/ref/templates/builtins/#time

person Balether    schedule 17.02.2020
comment
Я пытался, это не работает несколько раз, но спасибо - person Tizu; 25.02.2020