Метод 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 в базе данных:

Сопоставление модели 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
Похожие посты
Добавить комментарий

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