Фильтрация объектов Django по дате: использование DateField
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Если вам требуется быстро отфильтровать записи по диапазону дат в Django, используйте __range
в методе .filter()
. Вот пример элегантного кода:
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
на соответствующие имена вашей модели и поля с датами.
Разбор процесса фильтрации по диапазону дат
Каждая дата в себе таит тайну. Давайте разгадаем ее, разбирая пошагово, как работает фильтрация по диапазону дат в Django.
Учитываем границы
При фильтрации не забудьте включить последний день диапазона:
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
:
queryset = MyModel.objects.filter(date_field__year=2023, date_field__month=1)
Случаи, когда учитываем время
Если вы работаете с полем DateTimeField
, важно учитывать время:
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, аналогично машине времени:
events = Event.objects.filter(date__range=["1920-01-01", "1920-12-31"])
Записи из нашего журнала: "Чудеса, которыми был сопровождён год: [🎉 Новый 1920 год, 🗳️ День выборов, 🎄 Рождество]. Время передохнуть!"
Схожим образом, фильтр Django выбирает события из хроники ваших данных.
Оттачиваем мастерство фильтрации
Работаем профессионально с часовыми поясами
Если ваши данные поступают из разных временных зон, воспользуйтесь инструментами Django:
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 учитывайте время.
Полезные материалы
- QuerySet API reference | Django documentation | Django: официальная документация Django.
- Django ORM (Querysets) · HonKit: материалы от Django Girls для начинающих.
- datetime — Basic date and time types — Python 3.12.1 documentation: раздел документации Python для работы с
datetime
. - Range in Django QuerySet filter – Stack Overflow: вопросы и ответы о фильтрации по диапазону в Django на Stack Overflow.