summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Martin <tim@asymptotic.co.uk>2017-11-05 21:34:02 +0000
committerTim Graham <timograham@gmail.com>2017-12-26 10:39:47 -0500
commit5778b5701d6a0feb3053b70891cd8ce80b6e8601 (patch)
tree7c939b1477d232d2e3fbcf6b1b92d590454e6e3e
parent6deaddcca367d0143c815aaa42342021baa3b41e (diff)
Fixed #28731 -- Added an error message when using an empty Q() in a When expression.
Otherwise it generates invalid SQL.
-rw-r--r--django/db/models/expressions.py2
-rw-r--r--tests/expressions_case/tests.py5
2 files changed, 7 insertions, 0 deletions
diff --git a/django/db/models/expressions.py b/django/db/models/expressions.py
index 93fc7df82b..b5090d6771 100644
--- a/django/db/models/expressions.py
+++ b/django/db/models/expressions.py
@@ -818,6 +818,8 @@ class When(Expression):
condition, lookups = Q(**lookups), None
if condition is None or not getattr(condition, 'conditional', False) or lookups:
raise TypeError("__init__() takes either a Q object or lookups as keyword arguments")
+ if isinstance(condition, Q) and not condition:
+ raise ValueError("An empty Q() can't be used as a When() condition.")
super().__init__(output_field=None)
self.condition = condition
self.result = self._parse_expressions(then)[0]
diff --git a/tests/expressions_case/tests.py b/tests/expressions_case/tests.py
index 69e299bde9..90aba36031 100644
--- a/tests/expressions_case/tests.py
+++ b/tests/expressions_case/tests.py
@@ -1301,3 +1301,8 @@ class CaseWhenTests(SimpleTestCase):
When(condition=object())
with self.assertRaisesMessage(TypeError, msg):
When()
+
+ def test_empty_q_object(self):
+ msg = "An empty Q() can't be used as a When() condition."
+ with self.assertRaisesMessage(ValueError, msg):
+ When(Q(), then=Value(True))