From 55f529270125e17bf428585734dbcb33332a46de Mon Sep 17 00:00:00 2001 From: Simon Charette Date: Fri, 2 Aug 2024 15:21:12 -0400 Subject: [PATCH] [5.1.x] Fixed #35643 -- Fixed a crash when ordering a QuerySet by a reference containing "__". Regression in b0ad41198b3e333f57351e3fce5a1fb47f23f376. Refs #34013. The initial logic did not consider that annotation aliases can include lookup or transform separators. Thanks Gert Van Gool for the report and Mariusz Felisiak for the review. Backport of a16f13a8661297eda12c4177bb01fa2e5b5ccc56 from main. --- django/db/models/sql/compiler.py | 9 +++++++-- tests/aggregation/tests.py | 20 ++++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py index 7377e555c3..edcdd8d25b 100644 --- a/django/db/models/sql/compiler.py +++ b/django/db/models/sql/compiler.py @@ -388,8 +388,13 @@ class SQLCompiler: ) continue - ref, *transforms = col.split(LOOKUP_SEP) - if expr := self.query.annotations.get(ref): + if expr := self.query.annotations.get(col): + ref = col + transforms = [] + else: + ref, *transforms = col.split(LOOKUP_SEP) + expr = self.query.annotations.get(ref) + if expr: if self.query.combinator and self.select: if transforms: raise NotImplementedError( diff --git a/tests/aggregation/tests.py b/tests/aggregation/tests.py index 075e707102..a5914f1878 100644 --- a/tests/aggregation/tests.py +++ b/tests/aggregation/tests.py @@ -1750,6 +1750,26 @@ class AggregateTestCase(TestCase): ], ) + def test_order_by_aggregate_default_alias(self): + publisher_books = ( + Publisher.objects.values("book") + .annotate(Count("book")) + .order_by("book__count", "book__id") + .values_list("book", flat=True) + ) + self.assertQuerySetEqual( + publisher_books, + [ + None, + self.b1.id, + self.b2.id, + self.b3.id, + self.b4.id, + self.b5.id, + self.b6.id, + ], + ) + def test_empty_result_optimization(self): with self.assertNumQueries(0): self.assertEqual(