Метод datetimes
Метод datetimes применяется к QuerySet и возвращает новый QuerySet, содержащий объекты datetime.datetime, представляющие уникальные даты и времена из указанного поля, округленные до заданной точности. Метод принимает имя поля типа DateTimeField и аргумент kind, определяющий уровень точности: 'year', 'month', 'day', 'hour', 'minute' или 'second'. Результаты сортируются в порядке возрастания.
Параметр field_name указывает имя поля модели с типом DateTimeField, по которому производится выборка. Параметр kind задает уровень точности округления, а параметр order (необязательный) определяет порядок сортировки: 'ASC' (по возрастанию) или 'DESC' (по убыванию). По умолчанию используется 'ASC'. Также метод поддерживает параметр tzinfo для указания часового пояса.
Синтаксис
Model.objects.datetimes(field_name, kind, order='ASC', tzinfo=None)
Пример
Допустим, у нас есть модель Order с полем created_at типа DateTimeField. Извлечем уникальные даты создания заказов с точностью до дня:
from myapp.models import Order
res = Order.objects.datetimes('created_at', 'day')
for item in res:
print(item)
Результат выполнения кода:
"2026-01-01 00:00:00"
"2026-01-02 00:00:00"
"2026-01-03 00:00:00"
Пример
Извлечем уникальные часы создания заказов за последнюю неделю с сортировкой по убыванию:
from myapp.models import Order
from datetime import timedelta
from django.utils import timezone
now = timezone.now()
week_ago = now - timedelta(days=7)
orders = Order.objects.filter(created_at__gte=week_ago)
res = orders.datetimes('created_at', 'hour', order='DESC')
for item in res:
print(item)
Результат выполнения кода:
"2026-01-08 23:00:00"
"2026-01-08 22:00:00"
"2026-01-08 21:00:00"
Пример
Используем метод datetimes в комбинации с агрегацией для подсчета заказов по уникальным месяцам:
from myapp.models import Order
from django.db.models import Count
months = Order.objects.datetimes('created_at', 'month')
for month in months:
count = Order.objects.filter(created_at__month=month.month).count()
print(f"{month.strftime('%B %Y')}: {count}")
Результат выполнения кода:
"January 2026: 15"
"February 2026: 23"
"March 2026: 18"
Пример
Использование метода с явным указанием часового пояса для корректной обработки временных зон:
from myapp.models import Order
from pytz import timezone
tz = timezone('Europe/Moscow')
res = Order.objects.datetimes('created_at', 'day', tzinfo=tz)
for item in res:
print(item)
Результат выполнения кода:
"2026-01-01 00:00:00+03:00"
"2026-01-02 00:00:00+03:00"
"2026-01-03 00:00:00+03:00"