Django 如何做相关的 EXISTS 或 NOT EXISTS

Django How to do a correlated EXISTS or NOT EXISTS

如何在 Django 中执行以下相关的 EXISTS 和 NOT EXISTS?

我不想使用 IN 和 NOT IN。这些与 EXISTS 和 NOT EXISTS 不同。

相关的 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))