Как получить правильный и правильный запрос с помощью django where not exists statement
У меня есть такой запрос, который я хотел бы использовать в качестве фильтра:
select * from api_document ad
where not exists (
select 1
from api_documentactionuser ad2
where ad2.user_id=4 and ad2.action_id=3 and ad.id = ad2.document_id
limit 1
)
Что я пробовал с django это:
q = queryset.exclude(
Q(documentactionuser__action__id=3)
& Q(documentactionuser__user=current_user),
)
while queryset - это queryset на таблице api_document. Однако, когда я печатаю сгенерированный запрос, django продолжает разделять два условия на два запроса вместо того, чтобы просто использовать and, что в свою очередь возвращает мне неправильные данные:
select * FROM "api_document"
WHERE NOT (
EXISTS(SELECT 1 AS "a" FROM "api_documentactionuser" U1 WHERE (U1."action_id" = 3 AND U1."document_id" = ("api_document"."id")) LIMIT 1)
AND EXISTS(SELECT 1 AS "a" FROM "api_documentactionuser" U1 WHERE (U1."user_id" = 1 AND U1."document_id" = ("api_document"."id")) LIMIT 1)
)
Я пробовал цепочку exclude().exclude(), filter(~@()).filter(~@()) и вышеуказанный вариант, и все это возвращает почти тот же запрос, с теми же данными на выходе
Используйте ~Exists
и укажите набор запросов, который вы хотите проверить
queryset.filter(
~Exists(DocumentationActionUser.objects.filter(action__id=3).filter(user=current_user)
)
Должно сработать (не проверено - просто напечатал это прямо здесь, так что остерегайтесь опечаток! :) )