Django Как сделать корреляцию EXISTS или NOT EXISTS
Как я могу выполнить следующие корреляции EXISTS и NOT EXISTS в Django?
Я не хочу использовать IN и NOT IN. Это не то же самое, что EXISTS и NOT EXISTS.
Корреляция ИСЧЕЗАЕТ:
SELECT *
FROM foo
WHERE EXISTS (
SELECT 1
FROM bar
WHERE foo.baz = bar.baz
)
Корреляция НЕ СУЩЕСТВУЕТ:
SELECT *
FROM foo
WHERE NOT EXISTS (
SELECT 1
FROM bar
WHERE foo.baz = bar.baz
)
Вы можете использовать метод QuerySet - exists(). Предположим, что:
class Foo(models.Model):
bar = models.ForeignKey(Bar, ..., related_name='foos')
Вы можете проверить, есть ли связь:
foo = Foo.objects.get(id=1)
bar = Bar.objects.get(id=1)
bar.foos.exists() # returns True if not empty else False
foo.bar # returns related object or None
Вы можете использовать Exists() подзапрос для создания запроса, как вы хотите. Не совсем уверен, как выглядит ваша модель, но следующее может быть похоже на то, что вы хотите
from django.db.models import Exists, OuterRef
matching_bars = Bar.objects.filter(baz=OuterRef('baz'))
Foo.objects.filter(Exists(matching_bars))
Для использования NOT EXISTS просто префиксните подзапрос Exists с ~
Foo.objects.filter(~Exists(matching_bars))