summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--django/db/models/sql/compiler.py2
-rw-r--r--tests/ordering/tests.py6
2 files changed, 8 insertions, 0 deletions
diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py
index 348cfa381a..1faed5c416 100644
--- a/django/db/models/sql/compiler.py
+++ b/django/db/models/sql/compiler.py
@@ -358,11 +358,13 @@ class SQLCompiler:
if (
field.nulls_first is None and field.nulls_last is None
) or self.connection.features.supports_order_by_nulls_modifier:
+ field = field.copy()
field.expression = select_ref
# Alias collisions are not possible when dealing with
# combined queries so fallback to it if emulation of NULLS
# handling is required.
elif self.query.combinator:
+ field = field.copy()
field.expression = Ref(select_ref.refs, select_ref.source)
yield field, select_ref is not None
continue
diff --git a/tests/ordering/tests.py b/tests/ordering/tests.py
index 7ff38acc4a..b29404ed77 100644
--- a/tests/ordering/tests.py
+++ b/tests/ordering/tests.py
@@ -638,3 +638,9 @@ class OrderingTests(TestCase):
.first(),
self.a1,
)
+
+ def test_order_by_expr_query_reuse(self):
+ qs = Author.objects.annotate(num=Count("article")).order_by(
+ F("num").desc(), "pk"
+ )
+ self.assertCountEqual(qs, qs.iterator())