Фильтрация объектов Django по дате: использование DateField

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Если вам требуется быстро отфильтровать записи по диапазону дат в Django, используйте __range в методе .filter(). Вот пример элегантного кода:

Python
Скопировать код
from myapp.models import MyModel
from datetime import date

queryset = MyModel.objects.filter(date_field__range=(date(2023, 1, 1), date(2023, 1, 31)))

Замените MyModel и date_field на соответствующие имена вашей модели и поля с датами.

Кинга Идем в IT: пошаговый план для смены профессии

Разбор процесса фильтрации по диапазону дат

Каждая дата в себе таит тайну. Давайте разгадаем ее, разбирая пошагово, как работает фильтрация по диапазону дат в Django.

Учитываем границы

При фильтрации не забудьте включить последний день диапазона:

Python
Скопировать код
from datetime import timedelta

queryset = MyModel.objects.filter(date_field__gte=date(2023, 1, 1),
                                  date_field__lte=date(2023, 1, 31) + timedelta(days=1))

queryset = MyModel.objects.filter(date_field__gte=date(2023, 1, 1),
                                  date_field__lt=date(2023, 1, 31))

Работа с месяцами и годами

Можно сфокусироваться на конкретных месяцах или годах, используя __year и __month:

Python
Скопировать код
queryset = MyModel.objects.filter(date_field__year=2023, date_field__month=1)

Случаи, когда учитываем время

Если вы работаете с полем DateTimeField, важно учитывать время:

Python
Скопировать код
from datetime import datetime, time

start_datetime = datetime.combine(date(2023, 1, 1), time.min)
end_datetime = datetime.combine(date(2023, 1, 31), time.max)

queryset = MyModel.objects.filter(date_field__range=(start_datetime, end_datetime))

Переменные должны иметь говорящие имена, а синтаксис быть безупречным, чтобы всё соответствовало правилам Django.

Визуализация

Остановим нашу машину времени и продемонстрируем код:

Параметры машины времениДаты
Первый полёт"1920-01-01"
Конец света"1920-12-31"

Настроим фильтр Django, аналогично машине времени:

Python
Скопировать код
events = Event.objects.filter(date__range=["1920-01-01", "1920-12-31"])

Записи из нашего журнала: "Чудеса, которыми был сопровождён год: [🎉 Новый 1920 год, 🗳️ День выборов, 🎄 Рождество]. Время передохнуть!"

Схожим образом, фильтр Django выбирает события из хроники ваших данных.

Оттачиваем мастерство фильтрации

Работаем профессионально с часовыми поясами

Если ваши данные поступают из разных временных зон, воспользуйтесь инструментами Django:

Python
Скопировать код
from django.utils import timezone

now = timezone.now()
yesterday = now – timedelta(days=1)
queryset = MyModel.objects.filter(date_field__range=(yesterday, now))

Рекомендации по работе с фильтрацией дат

  • __range делает синтаксис чистым и понятным.
  • Стремитесь к консистентности в работе с датами и временем.
  • Используйте gte/lte и gt/lt для включения или исключения точной конечной даты.
  • При работе с полем datetime учитывайте время.

Полезные материалы

  1. QuerySet API reference | Django documentation | Django: официальная документация Django.
  2. Django ORM (Querysets) · HonKit: материалы от Django Girls для начинающих.
  3. datetime — Basic date and time types — Python 3.12.1 documentation: раздел документации Python для работы с datetime.
  4. Range in Django QuerySet filter – Stack Overflow: вопросы и ответы о фильтрации по диапазону в Django на Stack Overflow.