diff --git a/django/db/models/expressions.py b/django/db/models/expressions.py index 746fe04143..2494ec4139 100644 --- a/django/db/models/expressions.py +++ b/django/db/models/expressions.py @@ -1861,6 +1861,16 @@ class OrderBy(Expression): return [self.expression] def as_sql(self, compiler, connection, template=None, **extra_context): + if isinstance(self.expression, ColPairs): + sql_parts = [] + params = [] + for col in self.expression.get_cols(): + copy = self.copy() + copy.set_source_expressions([col]) + sql, col_params = compiler.compile(copy) + sql_parts.append(sql) + params.extend(col_params) + return ", ".join(sql_parts), params template = template or self.template if connection.features.supports_order_by_nulls_modifier: if self.nulls_last: diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py index 5bb491d823..251cc08e51 100644 --- a/django/db/models/sql/compiler.py +++ b/django/db/models/sql/compiler.py @@ -1117,10 +1117,9 @@ class SQLCompiler: ) return results targets, alias, _ = self.query.trim_joins(targets, joins, path) - target_fields = composite.unnest(targets) return [ (OrderBy(transform_function(t, alias), descending=descending), False) - for t in target_fields + for t in targets ] def _setup_joins(self, pieces, opts, alias): diff --git a/tests/composite_pk/test_order_by.py b/tests/composite_pk/test_order_by.py index 9d3dec58e7..f17d6b55e4 100644 --- a/tests/composite_pk/test_order_by.py +++ b/tests/composite_pk/test_order_by.py @@ -1,3 +1,4 @@ +from django.db.models import F from django.test import TestCase from .models import Comment, Tenant, User @@ -55,3 +56,17 @@ class CompositePKOrderByTests(TestCase): self.comment_1, # (1, 1) ), ) + + def test_order_comments_by_pk_expr(self): + self.assertQuerySetEqual( + Comment.objects.order_by("pk"), + Comment.objects.order_by(F("pk")), + ) + self.assertQuerySetEqual( + Comment.objects.order_by("-pk"), + Comment.objects.order_by(F("pk").desc()), + ) + self.assertQuerySetEqual( + Comment.objects.order_by("-pk"), + Comment.objects.order_by(F("pk").desc(nulls_last=True)), + )