14. Как использовать объекты Q для сложных запросов?

В предыдущих главах мы использовали объекты Q для операций OR и AND и NOT. Объекты Q обеспечивают полный контроль над пунктом where запроса.

Если вы хотите OR свои условия.

>>> from django.db.models import Q
>>> queryset = User.objects.filter(
    Q(first_name__startswith='R') | Q(last_name__startswith='D')
)
>>> queryset
<QuerySet [<User: Ricky>, <User: Ritesh>, <User: Radha>, <User: Raghu>, <User: rishab>]>

Если вы хотите AND свои условия.

>>> queryset = User.objects.filter(
    Q(first_name__startswith='R') & Q(last_name__startswith='D')
)
>>> queryset
<QuerySet [<User: Ricky>, <User: Ritesh>, <User: rishab>]>

Если вы хотите найти всех пользователей, чей first_name начинается с „R“, но не хотите, если last_name имеет „Z“

>>> queryset = User.objects.filter(
    Q(first_name__startswith='R') & ~Q(last_name__startswith='Z')
)

Если вы посмотрите на сформированный запрос, вы увидите

SELECT "auth_user"."id",
       "auth_user"."password",
       "auth_user"."last_login",
       "auth_user"."is_superuser",
       "auth_user"."username",
       "auth_user"."first_name",
       "auth_user"."last_name",
       "auth_user"."email",
       "auth_user"."is_staff",
       "auth_user"."is_active",
       "auth_user"."date_joined"
FROM "auth_user"
WHERE ("auth_user"."first_name"::text LIKE R%
       AND NOT ("auth_user"."last_name"::text LIKE Z%))

Вы можете комбинировать объекты Q более сложными способами для создания сложных запросов.

Вернуться на верх