summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--django/db/models/sql/compiler.py4
-rw-r--r--tests/regressiontests/aggregation_regress/tests.py6
2 files changed, 10 insertions, 0 deletions
diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py
index ace9cf4c88..841ec12f2d 100644
--- a/django/db/models/sql/compiler.py
+++ b/django/db/models/sql/compiler.py
@@ -493,7 +493,11 @@ class SQLCompiler(object):
params.extend(extra_params)
cols = (group_by + self.query.select +
self.query.related_select_cols + extra_selects)
+ seen = set()
for col in cols:
+ if col in seen:
+ continue
+ seen.add(col)
if isinstance(col, (list, tuple)):
result.append('%s.%s' % (qn(col[0]), qn(col[1])))
elif hasattr(col, 'as_sql'):
diff --git a/tests/regressiontests/aggregation_regress/tests.py b/tests/regressiontests/aggregation_regress/tests.py
index 0bb68991ea..14104210af 100644
--- a/tests/regressiontests/aggregation_regress/tests.py
+++ b/tests/regressiontests/aggregation_regress/tests.py
@@ -462,6 +462,12 @@ class AggregationTests(TestCase):
lambda b: b.name
)
+ # Regression for #15709 - Ensure each group_by field only exists once
+ # per query
+ qs = Book.objects.values('publisher').annotate(max_pages=Max('pages')).order_by()
+ grouping, gb_params = qs.query.get_compiler(qs.db).get_grouping()
+ self.assertEqual(len(grouping), 1)
+
def test_duplicate_alias(self):
# Regression for #11256 - duplicating a default alias raises ValueError.
self.assertRaises(ValueError, Book.objects.all().annotate, Avg('authors__age'), authors__age__avg=Avg('authors__age'))