Как сделать фильтр по дате django
У меня есть список лет. И я хочу отфильтровать объекты, которые относятся к определенным годам:
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 можно сцеплять, создавая цепочки:
Это мощный и удобный инструмент, позволяющий писать сложные запросы.
Отлично! Теперь ты готова к следующей части! Чтобы закрыть интерактивную консоль, набери:
Читайте также: