Как сделать фильтр по дате django

Добавил пользователь Владимир З.
Обновлено: 10.09.2024

У меня есть список лет. И я хочу отфильтровать объекты, которые относятся к определенным годам:

3 ответа

Определенно есть более приятное решение, чем это (написание свойства, которое отображает год, и использование этого с использованием фильтра date ()?), Но я не могу думать об этом сейчас:

Django 1.6 не поддерживает вложенные поиски, то есть year_in невозможен. В 1.7 поддерживаются вложенные поиски, но year_in не реализован в 1.7. Это скорее дополнение к 1.8. На данный момент Q-подход - это путь.

Генерация критериев фильтра во время выполнения (например, begYears не может быть жестко задана, но вычитается в реальной жизни):

Я пытаюсь фильтровать Match es, запланированные в определенный день. Я не могу просто так:

потому что он также фильтрует по времени, но я могу это сделать:

Но это слишком сложно, я чувствую, что может быть более простой способ.

Тогда я также могу использовать диапазон:

Но это просто кажется излишним, и это, вероятно, порождает неэффективный запрос.

Не могу ли я сделать запрос, чтобы указать фактическую дату? Что-то вроде:

Не нужно говорить, что я пробовал искать решение и не мог найти.

Из Django 1.9 вы можете использовать __date поле __date , точно так же, как вы упомянули в своем вопросе. Для более старых версий вам понадобятся другие методы.

Если вы не можете использовать фильтр __date , я думаю, что самым чистым способом было бы это сделать:

В этой статье мы будем работать с моделями данных. Если вам не знаком этот термин, обратитесь к этой статье.

Итак, допустим, у вас есть модель Post , которая описывает статью в блоге:

У модели есть 2 интересных поля: is_deleted и is_published . Эти поля хранят 2 вида значений: либо True , либо False .

Фильтрация

На главной странице блога обычно показывают все опубликованные статьи. То есть не все, а те, у которых is_published == True . Вот так можно получить их список:

Здесь мы достаём все посты из БД, а затем выбираем из них опубликованные.

Оказывается, в Django ORM можно сразу попросить прислать только опубликованные посты:

is_published — это название поля из модели данных Post . В filter можно указать название любого поля, из тех, что есть у модели данных:

Если подходящие объекты не найдутся, вам вернётся пустой QuerySet. Он ведёт себя как пустой список.

Фильтрация по нескольким полям

Кажется, мы совсем забыли про поле is_deleted . Если пост удалён, то его не нужно показывать на главной. Получается, нужно показать опубликованные посты и скрыть все удалённые. Можно сделать это так:

filter умеет комбинировать несколько условий

Операции сравнения

Если пользователь ищет на вашем сайте статьи со словом "питон" , то привычный способ фильтрации вам не поможет:

Здесь база данных будет искать посты, у которых заголовок в точности равен строке "питон" . А нам нужны статьи со словом "питон" в заголовке:

Поможет операция сравнения contains . Она позволит вам проверить, что заголовок содержит строку "питон" :

Все операции сравнения начинаются с двух подчёркиваний и прямо “приписываются” к полям. Есть и другие операции сравнения, например, __gt и __lt :

__gt — (greater then, в переводе, “больше чем”) проверяет, что поле больше, чем то, что передадут справа. Пример: filter(likes__gt=10) — фильтруем посты, у которых больше 10 лайков.

__lt — (less then, "меньше чем) аналогично, проверяет, что поле меньше.

Чтобы проверить условие “больше или равно”, есть операция сравнения __gte , а “меньше ли равно” — __lte .

Операции сравнения — фича Django ORM

Операции сравнения с двумя подчёкиваниями работают только в методах filter , exclude и get из Django ORM и нигде больше. Не пытайтесь использовать это в работе с другими библиотеками и функциями, они не поймут.

Что читать дальше

Попробуйте бесплатные уроки по Python

Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.

В этой главе ты узнаешь, как Django подключается к базе данных и сохраняет в неё информацию. Давай начнём!

Что такое QuerySet?

QuerySet, по сути, — список объектов заданной модели. QuerySet позволяет читать данные из базы данных, фильтровать и изменять их порядок.

Проще научиться на примере. Давай попробуем, согласна?

Интерактивная консоль Django

Открой свой локальный терминал (не на PythonAnywhere) и набери следующую команду:

Результат должен быть таким:

Ты находишься в интерактивной консоли Django. По сути, это та же интерактивная консоль Python, но с магией Django :) Ты можешь использовать весь синтаксис Python, разумеется.

Все объекты

Давай попробуем вывести на экран все записи в нашем блоге. Ты можешь сделать это следующей командой:

Упс! Ошибка. Она говорит, что не существует объекта с именем Post. И это верно — мы забыли импортировать его!

Всё просто: мы импортируем модель Post из blog.models . Давай попробуем получить все записи блога ещё раз:

Это список записей, с которыми мы работали до этого! Мы создали их через панель администратора Django. Теперь же мы хотим создавать записи с помощью Python, так как же мы этого добьёмся?

Создаём объект

Создать объект Post в базе данных можно следующим образом:

Но у нас есть один недочёт: me . Мы должны передать этой переменной экземпляр модели User , который будет отвечать за автора записи. Как это сделать?

Давай для начала импортируем модель User:

Какие пользователи есть в нашей базе данных? Попробуй эту команду:

Это суперпользователь, которого мы создали ранее! Нам нужен его экземпляр:

Как ты можешь заметить, мы получили ( get ) пользователя ( User ) с именем username 'ola'. Шикарно! В твоём случае имя, конечно, может отличаться.

Теперь мы, наконец, можем создать наш пост:

Ура! Хочешь проверить, что всё работает?

Есть, ещё один пост в списке!

Добавляем записи

Можешь повеселиться и добавить ещё записей. 2-3 будет достаточно.

Фильтрация объектов

Важной особенностью QuerySets является возможность фильтровать объекты. Предположим, нам нужно найти все записи пользователя ola. Мы используем метод filter вместо метода all в Post.objects.all() . В скобках мы укажем условия, по которым будет построена выборка записей. В нашей ситуации условием будет являться равенство поля author переменной me . В Django мы можем написать это следующим образом: author=me . Теперь наш код выглядит следующим образом:

А может быть мы хотим получить все записи со словом 'title' в поле title ?

Примечание: обрати внимание на два символа нижнего подчёркивания ( _ ) между title и contains . Django ORM использует этот синтаксис для разделения имён полей ("title") и операций или фильтров ("contains"). Если ты используешь только один символ нижнего подчёркивания, то получишь ошибку "FieldError: Cannot resolve keyword title_contains".

Ты также можешь получить список всех опубликованных записей. Мы просто отфильтруем записи по полю published_date :

К сожалению, пост, который мы добавили в консоли Python, ещё не опубликован. Мы можем изменить это! Сначала выберем запись, которую мы хотим опубликовать:

Дальше мы опубликуем её с помощью метода publish !

Сортировка объектов

QuerySets позволяет сортировать объекты. Давай попробуем сортировку по полю created_date :

Мы также можем изменить порядок на противоположный, добавив - в начало условия:

Соединение QuerySets

QuerySets можно сцеплять, создавая цепочки:

Это мощный и удобный инструмент, позволяющий писать сложные запросы.

Отлично! Теперь ты готова к следующей части! Чтобы закрыть интерактивную консоль, набери:

Читайте также: