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 содержит подстроку без учета регистра. |