summaryrefslogtreecommitdiff
path: root/django/db/models/sql
diff options
context:
space:
mode:
authorDavid Wobrock <david.wobrock@gmail.com>2023-03-13 15:03:28 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2023-03-24 06:09:27 +0100
commitd6b6e5d0fd4e6b6d0183b4cf6e4bd4f9afc7bf67 (patch)
tree1e81239741fa0b7a576879c42040953ed64e9708 /django/db/models/sql
parent39d1e45227e060746ed461fddde80fa2b6cf0dcd (diff)
Fixed #28553 -- Fixed annotation mismatch with QuerySet.values()/values_list() on compound queries.
Co-authored-by: Matthias Kestenholz <mk@feinheit.ch>
Diffstat (limited to 'django/db/models/sql')
-rw-r--r--django/db/models/sql/query.py17
1 files changed, 11 insertions, 6 deletions
diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py
index 103fffa47d..9865e88fd0 100644
--- a/django/db/models/sql/query.py
+++ b/django/db/models/sql/query.py
@@ -1087,7 +1087,12 @@ class Query(BaseExpression):
if select:
self.append_annotation_mask([alias])
else:
- self.set_annotation_mask(set(self.annotation_select).difference({alias}))
+ annotation_mask = (
+ value
+ for value in dict.fromkeys(self.annotation_select)
+ if value != alias
+ )
+ self.set_annotation_mask(annotation_mask)
self.annotations[alias] = annotation
def resolve_expression(self, query, *args, **kwargs):
@@ -2341,12 +2346,12 @@ class Query(BaseExpression):
if names is None:
self.annotation_select_mask = None
else:
- self.annotation_select_mask = set(names)
+ self.annotation_select_mask = list(dict.fromkeys(names))
self._annotation_select_cache = None
def append_annotation_mask(self, names):
if self.annotation_select_mask is not None:
- self.set_annotation_mask(self.annotation_select_mask.union(names))
+ self.set_annotation_mask((*self.annotation_select_mask, *names))
def set_extra_mask(self, names):
"""
@@ -2423,9 +2428,9 @@ class Query(BaseExpression):
return {}
elif self.annotation_select_mask is not None:
self._annotation_select_cache = {
- k: v
- for k, v in self.annotations.items()
- if k in self.annotation_select_mask
+ k: self.annotations[k]
+ for k in self.annotation_select_mask
+ if k in self.annotations
}
return self._annotation_select_cache
else: