Фильтрация DateTimeField по дате в Django: подходы и решения

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

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

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

Для того чтобы применить фильтрацию по дате в Django, вы должны использовать суффикс __date с названием поля DateTimeField в методе .filter(). Допустим, у нас есть модель Event с полем event_date, и мы хотим выбрать все события, принадлежащие 14 марта 2023 года:

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

events_on_specific_date = Event.objects.filter(event_date__date=date(2023, 3, 14))

Этот запрос вернёт все объекты Event, дата проведения которых (поле event_date) соответствует 14 марта 2023 года.

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

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

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

Фильтрация в рамках диапазона дат

Чтобы выбрать объекты Event, которые попадают в определенный период времени, используйте операторы __gte (больше или равно) и __lt (меньше):

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

events_within_date_range = Event.objects.filter(
    event_date__gte=datetime.combine(date(2023, 3, 14), datetime.min.time()),
    event_date__lt=datetime.combine(date(2023, 3, 15), datetime.min.time())
)

Приведенный выше запрос вернет события, происходящие с 14 марта и до, но не включающего, 15 марта 2023 года. Создание комбинированной даты и времени через datetime.combine с использованием datetime.min.time() в примере выше включает все моменты времени данного дня.

Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

Фильтрация по году, месяцу или дню

Фильтрацию по заданному году, месяцу или дню вы можете выполнять с помощью фильтров __year, __month и __day:

Python
Скопировать код
events_in_march = Event.objects.filter(event_date__month=3)

Фильтрация с учетом часовых поясов

Очень важно учитывать часовые пояса при фильтрации дат. Если вы используете datetime.now() вместо datetime.utcnow() или timezone.now(), и в настройках Django включена поддержка часовых поясов, то результаты фильтрации могут оказаться некорректными.

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

Давайте наглядно представим методы фильтрации поля DateTimeField в Django:

Markdown
Скопировать код
🗓️ Визуализация фильтрации DateTimeField в Django:

| Критерий запроса   | Фильтр QuerySet в Django |
| -------------- | ----------------------- |
| Точная дата     | `__date=`               |
| Диапазон дат    | `__range=`              |
| Дата до         | `__lt=`                 |
| Дата после      | `__gt=`                 |
| Год             | `__year=`               |
| Месяц           | `__month=`              |
| День            | `__day=`                |

Фильтрация событий, происходящих сегодня

Для выбора событий, произошедших сегодня, воспользуйтесь вызовом date.today():

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

today_events = Event.objects.filter(event_date__date=date.today())

Использование startswith и contains для фильтрации дат

Фильтры __startswith и __contains могут оказаться полезными, если нужно обработать дату как строку. Однако, стоит помнить, что такие методы могут противоречить календарной структуре дат:

Python
Скопировать код
events_in_january = Event.objects.filter(event_date__startswith='2023-01')

Использование представлений на основе дат в Django

Django предлагает удобные встроенные инструменты, такие как django.views.generic.date_based, которые облегчают отображение событий за сегодняшний день, текущий год или любой другой выбранный временной интервал.

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

  1. API QuerySet Reference | Django Documentation | Django — официальная документация Django по фильтрации по датам.
  2. datetime — Basic date and time types — Python 3.12.2 documentation — подробное описание работы с модулем datetime в Python.
  3. Form fields | Django documentation | Django — информация о работе с полями дат в формах Django.
  4. strftime.org – The ultimate strptime reference — полезная шпаргалка для strftime в Python.
  5. Making queries | Django documentation | Django — руководство по созданию запросов в Django.
  6. Getting Started – django-filter 23.5 documentation — описание создания пользовательских фильтров в Django.
  7. Time zones | Django documentation | Django — информация о работе с часовыми поясами в Django.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какой суффикс нужно использовать для фильтрации DateTimeField по дате в Django?
1 / 5