Django 5 для начинающих

Прогресс по курсу:  9/1004

3.7 Django ORM, поисковые поля и агрегатные функции
4 из 16 шагов пройдено
0 из 60 баллов  получено

Поисковые поля используют простой синтаксис двойного подчёркивания. 

<поле поиска>__<поисковый метод>
Worker.objects.filter(first_name__exact='John')

Под капотом Django создает запрос SQL WHERE для построения запросов к базе данных из применяемого поиска. Допускается многократный поиск, а также поисковые поля могут быть выстроены по цепочке:

Worker.objects.filter(first_name__exact='John', created__year__lt=2024)

Тем самым мы получаем сотрудника с именем John, созданного раньше 2024 года. Рассмотрим все методы поисковых полей:

 

Полный список поисковых методов в Django

  • exact/iexact:   Точное совпадение. iexact - версия без учета регистра.

  • contains/icontains:   Поле содержит текст поиска. icontains это версия без учета регистра.

  • in:   В указанной итерации (список, кортеж или QuerySet).

  • gt/gte:   Больше чем / больше чем или равно.

  • lt/lte:   Меньше чем / меньше чем или равно.

  • startswith/istartswith:   Начинается в строке поиска. istartswith это версия без учета регистра.

  • endswith/iendswith:   Заканчивается в строке поиска. iendswith это версия без учета регистра.

  • range:   Тест диапазона. Диапазон включает в себя начальное и конечное значения.

  • date:   Передает значение в виде даты. Используется для поиска полей datetime.

  • year:   Поиск точного совпадения года.

  • iso_year:   Поиск точного совпадения по году ISO 8601.

  • month:   Поиск точного совпадения месяца.

  • day:   Поиск точного совпадения дня.

  • week:   Поиск точного совпадения недели.

  • week_day:   Поиск точного совпадения дня недели.

  • quarter:   Поиск точного совпадения квартала года.

  • time:   Использует значение времени. Используется для поиска полей datetime.

  • hour/minute/second:   Поиск точного совпадения по часам, минутам или секундам.

  • isnull:   Проверяет, есть ли нулевое поле. Возвращает True или False.

  • regex/iregex:   Совпадение по регулярному выражению. iregex - версия без учета регистра.

Подробнее о методах вы можете посмотреть в документации.  По аналогии с прошлым разделом запустим шелл и импортируем модель Worker и на практике рассмотрим некоторые методы подробнее:

 

 exact/iexact

Поиск exact используется для получения записей с указанным значением. Поиск exact чувствителен к регистру. Для поиска без учета регистра используйте iexact поиск.

Worker.objects.filter(first_name__exact='John')

 

contains/icontains

Позволяет contains вам проверить, содержит ли строка подстроку. Это эквивалентно следующему LIKE оператору:

LIKE '%substring%'

Например, следующий код находит сотрудников, чье имя содержит подстроку Jes:

Worker.objects.filter(first_name__contains='Jes')

Запрос возвращает сотрудника с именем Jessie.

Это icontains нечувствительная к регистру версия файла contains. Таким образом, вы можете использовать, icontains чтобы проверить, содержит ли строка подстроку без учета регистра:

Worker.objects.filter(first_name__icontains='jes')

 

in()

Оператор SQL IN возвращает QuerySet, если значение одного из полей равно одному из значений:

field_name IN (v1, v2, ...)

В Django вы используете in оператор:

Worker.objects.filter(age__in=(25, 31)) 


  • Комментария
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий
Комментарий закреплён

Понравилась задача, тест или урок? Поставьте лайк, поддержите курс. Ваша поддержка очень важна для нас.

Между этим "<поле поиска>__<поиск>" и этим "Полный список поисковых полей Django" есть несоответствие.

Судя по списку поисковых полей и примерам, они(поисковые поля) пишутся после двух нижних подчеркиваний. Или я что-то путаю?

@Aleksandr_Gurov, Переделал на <поле поиска>__<поисковый метод>, так думаю будет более понятно.

А чем exact отличается от простого знака равенства, то есть чем

Worker.objects.filter(first_name__exact='John')

отличается от

Worker.objects.filter(first_name='John')

@Агаси_Мироян, Они эквивалентны, но возможно есть разница у них в каких нибудь экзотических БД.

@Илья_Перминов, спасибо.

Скорее всего опечатка в тексте, разная подстрока используется:

@Vladislav_Rumiantsev, спасибо, исправил.