Метод Django QuerySet exist() в Python — пример
Функция Django QuerySet exist() используется в Python для проверки наличия в QuerySet каких-либо строк.
Введение в метод Django QuerySet exist()
Иногда вы хотите проверить, содержит ли запрос какие-либо строки. Для этого вы используете метод exist() объекта QuerySet.
Метод exist() возвращает True, если QuerySet содержит какие-либо строки, или False в противном случае. За кулисами exist() попытается выполнить запрос максимально быстрым способом. Однако запрос будет почти идентичен обычному запросу QuerySet.
Предположим, у вас есть QuerySet и вы хотите проверить, есть ли в нем какие-либо объекты. Вместо того, чтобы делать так:
if query_set: print('the queryset has at least one object')
…вам следует использовать exist(), так как это немного быстрее:
if query_set.exists(): print('the queryset has at least one object')
В Django 4.1 добавлена функция aexists(), которая является асинхронной версией exist().
Пример метода Django exist()
Для демонстрации мы будем использовать модель Employee. Модель Employee сопоставляется с таблицей hr_employee в базе данных:
- Сначала выполните команду shell_plus:
python manage.py shell_plus
- Во-вторых, найдите сотрудников, чьи имена начинаются на букву J:
>>> Employee.objects.filter(first_name__startswith='J').exists() SELECT 1 AS "a" FROM "hr_employee" WHERE "hr_employee"."first_name"::text LIKE 'J%' LIMIT 1 Execution time: 0.000000s [Database: default] True
Обратите внимание, что Django сгенерировал SQL на основе PostgreSQL. Если вы используете другие базы данных, вы можете увидеть немного другой оператор SQL.
В этом примере метод exist() возвращает True. Он выбирает только первую строку, чтобы определить, содержит ли QuerySet какую-либо строку.
Если вы не используете метод exist(), QuerySet получит все строки из таблицы hr_employee:
>>> qs = Employee.objects.filter(first_name__startswith='J') >>> print(qs.query) 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 J% ORDER BY "hr_employee"."first_name" ASC, "hr_employee"."last_name" ASC