1
0
mirror of https://github.com/django/django.git synced 2025-10-23 21:59:11 +00:00

Fixed #34013 -- Added QuerySet.order_by() support for annotation transforms.

Thanks Eugene Morozov and Ben Nace for the reports.
This commit is contained in:
Simon Charette
2023-12-08 02:03:14 -05:00
committed by Mariusz Felisiak
parent fcf95e5927
commit b0ad41198b
6 changed files with 97 additions and 12 deletions

View File

@@ -25,6 +25,7 @@ from django.db.models import (
Subquery,
Sum,
TimeField,
Transform,
Value,
Variance,
When,
@@ -1727,6 +1728,28 @@ class AggregateTestCase(TestCase):
ordered=False,
)
def test_order_by_aggregate_transform(self):
class Mod100(Mod, Transform):
def __init__(self, expr):
super().__init__(expr, 100)
sum_field = IntegerField()
sum_field.register_instance_lookup(Mod100, "mod100")
publisher_pages = (
Book.objects.values("publisher")
.annotate(sum_pages=Sum("pages", output_field=sum_field))
.order_by("sum_pages__mod100")
)
self.assertQuerySetEqual(
publisher_pages,
[
{"publisher": self.p2.id, "sum_pages": 528},
{"publisher": self.p4.id, "sum_pages": 946},
{"publisher": self.p1.id, "sum_pages": 747},
{"publisher": self.p3.id, "sum_pages": 1482},
],
)
def test_empty_result_optimization(self):
with self.assertNumQueries(0):
self.assertEqual(