Как получить правильный и правильный запрос с помощью 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)
)

Должно сработать (не проверено - просто напечатал это прямо здесь, так что остерегайтесь опечаток! :) )

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