summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--django/db/models/expressions.py9
-rw-r--r--tests/expressions/tests.py8
2 files changed, 17 insertions, 0 deletions
diff --git a/django/db/models/expressions.py b/django/db/models/expressions.py
index 30d44650ec..181a04493f 100644
--- a/django/db/models/expressions.py
+++ b/django/db/models/expressions.py
@@ -1624,6 +1624,15 @@ class Exists(Subquery):
sql = "CASE WHEN {} THEN 1 ELSE 0 END".format(sql)
return sql, params
+ def as_sql(self, compiler, *args, **kwargs):
+ try:
+ return super().as_sql(compiler, *args, **kwargs)
+ except EmptyResultSet:
+ features = compiler.connection.features
+ if not features.supports_boolean_expr_in_select_clause:
+ return "1=0", ()
+ return compiler.compile(Value(False))
+
@deconstructible(path="django.db.models.OrderBy")
class OrderBy(Expression):
diff --git a/tests/expressions/tests.py b/tests/expressions/tests.py
index f26a6275ea..073e2e9258 100644
--- a/tests/expressions/tests.py
+++ b/tests/expressions/tests.py
@@ -2294,6 +2294,14 @@ class ExistsTests(TestCase):
self.assertSequenceEqual(qs, [manager])
self.assertIs(qs.get().not_exists, True)
+ def test_filter_by_empty_exists(self):
+ manager = Manager.objects.create()
+ qs = Manager.objects.annotate(exists=Exists(Manager.objects.none())).filter(
+ pk=manager.pk, exists=False
+ )
+ self.assertSequenceEqual(qs, [manager])
+ self.assertIs(qs.get().exists, False)
+
class FieldTransformTests(TestCase):
@classmethod