diff options
| author | Simon Charette <charette.s@gmail.com> | 2023-03-30 01:23:12 -0400 |
|---|---|---|
| committer | Sarah Boyce <42296566+sarahboyce@users.noreply.github.com> | 2024-07-03 16:36:25 +0200 |
| commit | 6d220963fa275a8431fcbcc05de1468f9f8bc3d3 (patch) | |
| tree | 1cb52cca46cd0e7deaf2ebe918b0324f8cbd0a6e | |
| parent | 65ad4ade74dc9208b9d686a451cd6045df0c9c3a (diff) | |
Fixed #28900 -- Propagated all selected fields to combinator queries.
Previously, only the selected column aliases would be propagated and
annotations were ignored.
| -rw-r--r-- | django/db/models/sql/compiler.py | 11 | ||||
| -rw-r--r-- | tests/queries/test_qs_combinators.py | 6 | ||||
| -rw-r--r-- | tests/queries/tests.py | 10 |
3 files changed, 14 insertions, 13 deletions
diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py index d606505cdf..f3aed06d81 100644 --- a/django/db/models/sql/compiler.py +++ b/django/db/models/sql/compiler.py @@ -591,20 +591,15 @@ class SQLCompiler: # generate valid SQL. compiler.elide_empty = False parts = () + selected = self.query.selected for compiler in compilers: try: # If the columns list is limited, then all combined queries # must have the same columns list. Set the selects defined on # the query on all combined queries, if not already set. - if not compiler.query.values_select and self.query.values_select: + if selected is not None and compiler.query.selected is None: compiler.query = compiler.query.clone() - compiler.query.set_values( - ( - *self.query.extra_select, - *self.query.values_select, - *self.query.annotation_select, - ) - ) + compiler.query.set_values(selected) part_sql, part_args = compiler.as_sql(with_col_aliases=True) if compiler.query.combinator: # Wrap in a subquery if wrapping in parentheses isn't diff --git a/tests/queries/test_qs_combinators.py b/tests/queries/test_qs_combinators.py index e130613084..eac1533803 100644 --- a/tests/queries/test_qs_combinators.py +++ b/tests/queries/test_qs_combinators.py @@ -282,11 +282,7 @@ class QuerySetSetOperationTests(TestCase): ) .values_list("num", "count") ) - qs2 = ( - Number.objects.filter(num=2) - .extra(select={"count": 1}) - .values_list("num", "count") - ) + qs2 = Number.objects.filter(num=2).extra(select={"count": 1}) self.assertCountEqual(qs1.union(qs2), [(1, 0), (2, 1)]) def test_union_with_values_list_on_annotated_and_unannotated(self): diff --git a/tests/queries/tests.py b/tests/queries/tests.py index 3621b6cb2c..ec88fa558d 100644 --- a/tests/queries/tests.py +++ b/tests/queries/tests.py @@ -1375,6 +1375,16 @@ class Queries1Tests(TestCase): self.assertCountEqual(items_after, [self.i2, self.i3, self.i4]) self.assertCountEqual(items_before, items_after) + def test_union_values_subquery(self): + items = Item.objects.filter(creator=OuterRef("pk")) + item_authors = Author.objects.annotate(is_creator=Exists(items)).order_by() + reports = Report.objects.filter(creator=OuterRef("pk")) + report_authors = Author.objects.annotate(is_creator=Exists(reports)).order_by() + all_authors = item_authors.union(report_authors).order_by("is_creator") + self.assertEqual( + list(all_authors.values_list("is_creator", flat=True)), [False, True] + ) + class Queries2Tests(TestCase): @classmethod |
