summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMariusz Felisiak <felisiak.mariusz@gmail.com>2020-07-07 12:15:05 +0200
committerGitHub <noreply@github.com>2020-07-07 12:15:05 +0200
commitae8338daf34fd746771e0678081999b656177bae (patch)
treeb9b3e84191821522e419b8633c60b99fa9511d6c
parentcb0da637a69b79ab371be9ee202335190a3a506e (diff)
Fixed #31767 -- Fixed QuerySet.none() on combined queryset.
-rw-r--r--django/db/models/sql/query.py3
-rw-r--r--tests/queries/test_qs_combinators.py7
2 files changed, 10 insertions, 0 deletions
diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py
index c913267476..1623263964 100644
--- a/django/db/models/sql/query.py
+++ b/django/db/models/sql/query.py
@@ -305,6 +305,7 @@ class Query(BaseExpression):
obj.annotation_select_mask = None
else:
obj.annotation_select_mask = self.annotation_select_mask.copy()
+ obj.combined_queries = tuple(query.clone() for query in self.combined_queries)
# _annotation_select_cache cannot be copied, as doing so breaks the
# (necessary) state in which both annotations and
# _annotation_select_cache point to the same underlying objects.
@@ -1777,6 +1778,8 @@ class Query(BaseExpression):
def set_empty(self):
self.where.add(NothingNode(), AND)
+ for query in self.combined_queries:
+ query.set_empty()
def is_empty(self):
return any(isinstance(c, NothingNode) for c in self.where.children)
diff --git a/tests/queries/test_qs_combinators.py b/tests/queries/test_qs_combinators.py
index 9c6fd474ca..75e2aa2f39 100644
--- a/tests/queries/test_qs_combinators.py
+++ b/tests/queries/test_qs_combinators.py
@@ -51,6 +51,13 @@ class QuerySetSetOperationTests(TestCase):
self.assertEqual(len(list(qs1.union(qs2, all=True))), 20)
self.assertEqual(len(list(qs1.union(qs2))), 10)
+ def test_union_none(self):
+ qs1 = Number.objects.filter(num__lte=1)
+ qs2 = Number.objects.filter(num__gte=8)
+ qs3 = qs1.union(qs2)
+ self.assertSequenceEqual(qs3.none(), [])
+ self.assertNumbersEqual(qs3, [0, 1, 8, 9], ordered=False)
+
@skipUnlessDBFeature('supports_select_intersection')
def test_intersection_with_empty_qs(self):
qs1 = Number.objects.all()