diff options
| author | Simon Charette <charette.s@gmail.com> | 2024-08-02 15:21:12 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-08-02 16:21:12 -0300 |
| commit | a16f13a8661297eda12c4177bb01fa2e5b5ccc56 (patch) | |
| tree | 62634ecab5041adbb2e5c03314ddd5f7aa05e1e6 | |
| parent | b478cae00643d6730746f2614792b35a7d3187ff (diff) | |
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.
| -rw-r--r-- | django/db/models/sql/compiler.py | 9 | ||||
| -rw-r--r-- | 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 1d426f49b6..49263d5944 100644 --- a/django/db/models/sql/compiler.py +++ b/django/db/models/sql/compiler.py @@ -403,8 +403,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( |
