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))
如何在 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))