Django LIKE в Python на примерах

В этом уроке вы узнаете, как запрашивать данные, используя сопоставление с шаблоном в Django, что эквивалентно оператору LIKE в Python.

Для демонстрации мы будем использовать модели Employee из приложения HR. Модель Employee сопоставляется с таблицей hr_employee в базе данных:

Содержание

startswith и istartswith

Иногда вы хотите проверить, начинается ли строка с подстроки. Например, вы можете захотеть найти сотрудников, чьи имена начинаются с Je.

Для этого в SQL используется оператор LIKE следующим образом:

SELECT * 
FROM hr_employee
WHERE first_name LIKE 'Je%';

% — это подстановочный знак, который соответствует любому количеству символов. А ‘Je%’ соответствует строкам, которые начинаются с Je и за которыми следует ноль или более символов.

Чтобы запросить данные из Django с помощью оператора LIKE, используйте startswith, добавив его к имени поля:

field_name__startswith

Например, следующий код использует метод filter() для поиска сотрудников, чьи имена начинаются с Je:

>>> Employee.objects.filter(first_name__startswith='Je') 
SELECT "hr_employee"."id",        
       "hr_employee"."first_name",
       "hr_employee"."last_name", 
       "hr_employee"."contact_id",
       "hr_employee"."department_id"
  FROM "hr_employee"
 WHERE "hr_employee"."first_name"::text LIKE 'Je%'
 LIMIT 21
Execution time: 0.000998s [Database: default]
<QuerySet [<Employee: Jennifer Thompson>, <Employee: Jerry Cunningham>, <Employee: Jesus Reilly>, <Employee: Jessica Lewis>, <Employee: Jeanette Hendrix>, <Employee: Jeffrey Castro>, <Employee: Jessica Jackson>, <Employee: Jennifer Bender>, <Employee: Jennifer Moyer>]>

Если вы хотите найти сотрудников, чьи имена начинаются с буквы Je без учета регистра, вы можете использовать функцию istartswith:

>>> Employee.objects.filter(first_name__istartswith='je') 
SELECT "hr_employee"."id",
       "hr_employee"."first_name",
       "hr_employee"."last_name",
       "hr_employee"."contact_id",
       "hr_employee"."department_id"
  FROM "hr_employee"
 WHERE UPPER("hr_employee"."first_name"::text) LIKE UPPER('je%')
 LIMIT 21
Execution time: 0.001398s [Database: default]
<QuerySet [<Employee: Jennifer Thompson>, <Employee: Jerry Cunningham>, <Employee: Jesus Reilly>, <Employee: Jessica Lewis>, <Employee: Jeanette Hendrix>, <Employee: Jeffrey Castro>, <Employee: Jessica Jackson>, <Employee: Jennifer Bender>, <Employee: Jennifer Moyer>]>

В этом случае __istartswith использует версию значения в верхнем регистре для сопоставления..

endswith и iendswith

endswith и iendswith возвращают True, если значение заканчивается подстрокой. endswith эквивалентны следующему оператору LIKE:

LIKE '%substring'

Например, в следующем примере оператор endswith используется для поиска сотрудников, чьи имена заканчиваются на er:

>>> Employee.objects.filter(first_name__endswith='er')           
SELECT "hr_employee"."id",
       "hr_employee"."first_name",
       "hr_employee"."last_name",
       "hr_employee"."contact_id",
       "hr_employee"."department_id"
  FROM "hr_employee"
 WHERE "hr_employee"."first_name"::text LIKE '%er'
 LIMIT 21
Execution time: 0.000999s [Database: default]
<QuerySet [<Employee: Jennifer Thompson>, <Employee: Tyler Briggs>, <Employee: Spencer Riggs>, <Employee: Roger Robinson>, <Employee: Hunter Boyd>, <Employee: Amber Brown>, <Employee: Tyler Coleman>, <Employee: Jennifer Bender>, <Employee: Jennifer Moyer>]>

Возвращает сотрудников с именами Дженнифер, Тайлер, Спенсер, Роджер и т. д.

Iendswith — это нечувствительная к регистру версия endswith. Например:

>>> Employee.objects.filter(first_name__iendswith='ER') 
SELECT "hr_employee"."id",
       "hr_employee"."first_name",
       "hr_employee"."last_name",
       "hr_employee"."contact_id",
       "hr_employee"."department_id"
  FROM "hr_employee"
 WHERE UPPER("hr_employee"."first_name"::text) LIKE UPPER('%ER')
 LIMIT 21
Execution time: 0.000999s [Database: default]
<QuerySet [<Employee: Jennifer Thompson>, <Employee: Tyler Briggs>, <Employee: Spencer Riggs>, <Employee: Roger Robinson>, <Employee: Hunter Boyd>, <Employee: Amber Brown>, <Employee: Tyler Coleman>, <Employee: Jennifer Bender>, <Employee: Jennifer Moyer>]>

contains и icontains

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

LIKE '%substring%'

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

>>> Employee.objects.filter(first_name__contains='ff')  
SELECT "hr_employee"."id",
       "hr_employee"."first_name",
       "hr_employee"."last_name",
       "hr_employee"."contact_id",
       "hr_employee"."department_id"
  FROM "hr_employee"
 WHERE "hr_employee"."first_name"::text LIKE '%ff%'
 LIMIT 21
Execution time: 0.001293s [Database: default]
<QuerySet [<Employee: Tiffany Jackson>, <Employee: Tiffany Holt>, <Employee: Jeffrey Castro>]>

Запрос возвращает сотрудников с именами Тиффани и Джеффри.

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

>>> Employee.objects.filter(first_name__icontains='ff') 
SELECT "hr_employee"."id",
       "hr_employee"."first_name",
       "hr_employee"."last_name",
       "hr_employee"."contact_id",
       "hr_employee"."department_id"
  FROM "hr_employee"
 WHERE UPPER("hr_employee"."first_name"::text) LIKE UPPER('%ff%')
 LIMIT 21
Execution time: 0.002012s [Database: default]
<QuerySet [<Employee: Tiffany Jackson>, <Employee: Tiffany Holt>, <Employee: Jeffrey Castro>]>

Заключение

Django SQL LIKE Значение
field_name__startswith=’substring’ field_name LIKE ‘%substring’ возвращает True, если field_name начинается с подстроки.
field_name__istartswith=’substring’ UPPER(field_name) LIKE UPPER(‘%substring’) возвращает True, если field_name начинается с подстроки без учета регистра
field_name__endswith=’substring’ field_name LIKE ‘substring%’ возвращает True, если field_name заканчивается подстрокой.
field_name__iendswith=’substring’ UPPER(field_name) LIKE UPPER(‘substring%’) возвращает True, если field_name заканчивается подстрокой без учета регистра
field_name__contains=’substring’ field_name LIKE ‘%substring%’ возвращает True, если field_name содержит подстроку.
field_name__icontains=’substring’ UPPER(field_name) LIKE UPPER(‘%substring%’) возвращает True, если field_name содержит подстроку без учета регистра.

 

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *