Метод datetimes

Метод datetimes применяется к QuerySet и возвращает новый QuerySet, содержащий объекты datetime.datetime, представляющие уникальные даты и времена из указанного поля, округленные до заданной точности. Метод принимает имя поля типа DateTimeField и аргумент kind, определяющий уровень точности: 'year', 'month', 'day', 'hour', 'minute' или 'second'. Результаты сортируются в порядке возрастания.

Параметр field_name указывает имя поля модели с типом DateTimeField, по которому производится выборка. Параметр kind задает уровень точности округления, а параметр order (необязательный) определяет порядок сортировки: 'ASC' (по возрастанию) или 'DESC' (по убыванию). По умолчанию используется 'ASC'. Также метод поддерживает параметр tzinfo для указания часового пояса.

Синтаксис

pythonModel.objects.datetimes(field_name, kind, order='ASC', tzinfo=None)

Пример

Допустим, у нас есть модель Order с полем created_at типа DateTimeField. Извлечем уникальные даты создания заказов с точностью до дня:

pythonfrom myapp.models import Order

res = Order.objects.datetimes('created_at', 'day')
for item in res:
  print(item)

Результат выполнения кода:

python"2026-01-01 00:00:00"
"2026-01-02 00:00:00"
"2026-01-03 00:00:00"

Пример

Извлечем уникальные часы создания заказов за последнюю неделю с сортировкой по убыванию:

pythonfrom 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)

Результат выполнения кода:

python"2026-01-08 23:00:00"
"2026-01-08 22:00:00"
"2026-01-08 21:00:00"

Пример

Используем метод datetimes в комбинации с агрегацией для подсчета заказов по уникальным месяцам:

pythonfrom 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}")

Результат выполнения кода:

python"January 2026: 15"
"February 2026: 23"
"March 2026: 18"

Пример

Использование метода с явным указанием часового пояса для корректной обработки временных зон:

pythonfrom 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)

Результат выполнения кода:

python"2026-01-01 00:00:00+03:00"
"2026-01-02 00:00:00+03:00"
"2026-01-03 00:00:00+03:00"

Смотрите также

  • метод dates,
    который извлекает уникальные даты из DateField
  • метод filter,
    который фильтрует QuerySet по заданным условиям
  • метод aggregate,
    который выполняет агрегирование значений
  • метод annotate,
    который добавляет аннотации к каждому объекту в QuerySet