Поле DurationField
Поле DurationField в Django предназначено для хранения промежутков времени. Оно работает с объектами timedelta из стандартного модуля datetime. Это поле удобно использовать для хранения длительности событий, времени выполнения задач или любых других интервалов. В базе данных значение хранится в микросекундах или как интервал, в зависимости от используемой СУБД.
Синтаксис
from django.db import models
class MyModel(models.Model):
duration = models.DurationField(
verbose_name="Длительность",
null=True,
blank=True,
default=timedelta(0)
)
Пример
Создадим модель Task с полем DurationField для хранения времени выполнения задачи:
from django.db import models
from datetime import timedelta
class Task(models.Model):
name = models.CharField(max_length=100)
estimated_time = models.DurationField(default=timedelta(hours=1))
actual_time = models.DurationField(null=True, blank=True)
def __str__(self):
return self.name
Пример
Создадим задачу с оценочным временем в 2 часа 30 минут:
from myapp.models import Task
from datetime import timedelta
task = Task.objects.create(
name="Write documentation",
estimated_time=timedelta(hours=2, minutes=30)
)
print(task.estimated_time)
Результат выполнения кода:
"2:30:00"
Пример
Обновим фактическое время выполнения задачи:
from myapp.models import Task
from datetime import timedelta
task = Task.objects.get(name="Write documentation")
task.actual_time = timedelta(days=1, hours=3, minutes=15)
task.save()
res = Task.objects.values('name', 'actual_time')
print(res)
Результат выполнения кода:
[{'name': 'Write documentation', 'actual_time': datetime.timedelta(days=1, seconds=11700)}]
Пример
Отфильтруем задачи, у которых оценочное время превышает 2 часа:
from myapp.models import Task
from datetime import timedelta
long_tasks = Task.objects.filter(estimated_time__gt=timedelta(hours=2))
for task in long_tasks:
print(task.name, task.estimated_time)
Результат выполнения кода:
"Write documentation 2:30:00"
"Design database 3:45:00"
Пример
Используем агрегацию для вычисления общего времени выполнения всех задач:
from myapp.models import Task
from django.db.models import Sum
total_time = Task.objects.aggregate(Sum('estimated_time'))
res = total_time['estimated_time__sum']
print(res)
Результат выполнения кода:
"6:15:00"
Смотрите также
-
поле
DateTimeField,
которое хранит дату и время -
поле
DateField,
которое хранит только дату -
поле
TimeField,
которое хранит только время -
модуль
IntegerField,
который хранит целочисленные значения