У вас есть только часы и минуты в durationfield Django
Я хотел бы иметь поле продолжительности, выраженное в часах и минутах. Выкладываю свой код: views.py
log_entry = LogEntry.objects.filter(Q(date__range=[start_date, end_date]) & Q(
student_id__id__icontains=student) & Q(instructor_id__id__icontains=instructor) & Q(aircraft_id__id__icontains=aircraft))
total_flight_hours = log_entry_dual.aggregate(eet=Sum(ExpressionWrapper(
F('ata') - F('etd'), output_field=IntegerField()), output_field=DurationField()))['eet']
Теперь, total_flight_hours печатается в моем шаблоне как (например) 03:00:00, что означает 3 часа. Поскольку мне нужны только часы и минуты, а секунды меня не волнуют, есть ли способ избавиться от секунд? Заранее большое спасибо
Я не уверен, как структурирован ваш шаблон и где используются часы и минуты. Если в вашем шаблоне будет принята строка, которую передает django, я думаю, это будет работать:
from datetime import timedelta
def timedelta_to_hm(td: timedelta) -> str:
if td.seconds % 60 > 29:
td += timedelta(seconds=30)
a = str(td)
b = a[-8:].lstrip(' ')
return b[:-3]
timedelta_to_hm(timedelta(days=1, hours=2,minutes=20, seconds=0)) # '2:20'
timedelta_to_hm(timedelta(hours=26,minutes=20, seconds=0)) # '2:20'
timedelta_to_hm(timedelta(hours=21,minutes=20, seconds=31)) # '21:21'
timedelta_to_hm(timedelta(hours=1,minutes=20, seconds=29)) # '1:20'
timedelta_to_hm(timedelta(hours=1,minutes=20, seconds=31)) # '1:21'
timedelta_to_hm(timedelta(hours=1,minutes=20, seconds=39)) # '1:21'
timedelta_to_hm(timedelta(minutes=0, seconds=39)) # '0:01'
Здесь я думаю что-то вроде этого в вашем html шаблоне, где ctxt - это контекст с параметризованными данными шаблона.
<p>We start at
<time datetime={{ctxt.hours_minutes}}>{{ctxt.hours_minutes}}</time>
sharp.
</p>
Обратите внимание, что в часах отсутствуют ведущие 0. Если вам нужен ведущий 0, вы можете добавить его в тех случаях, когда это необходимо в функции. Кроме того, я округляю в большую сторону на 30 секунд. Поведение по умолчанию без округления было бы всегда округлением вниз (аналогично целочисленному делению).
Это также предполагает, что часы и минуты попадают в ваш шаблон, и вы не делаете никаких других вычислений для часов и минут.
Если вы хотите выполнять другие вычисления, то лучше не конвертировать в строку, а продолжить вычисления для извлечения часов и минут напрямую. Возможно, используя один из подходов, описанных в другом вопросе здесь.