diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py index 3cab405d2d..52ea717ca6 100644 --- a/django/db/models/sql/compiler.py +++ b/django/db/models/sql/compiler.py @@ -722,6 +722,8 @@ class SQLCompiler: results = [] for item in opts.ordering: + if hasattr(item, 'resolve_expression') and not isinstance(item, OrderBy): + item = item.desc() if descending else item.asc() if isinstance(item, OrderBy): results.append((item, False)) continue diff --git a/tests/ordering/models.py b/tests/ordering/models.py index 4a3e340e71..62df09351f 100644 --- a/tests/ordering/models.py +++ b/tests/ordering/models.py @@ -33,7 +33,7 @@ class Article(models.Model): class Meta: ordering = ( '-pub_date', - 'headline', + models.F('headline'), models.F('author__name').asc(), OrderBy(models.F('second_author__name')), ) diff --git a/tests/ordering/tests.py b/tests/ordering/tests.py index afc8791a05..5ee3c60324 100644 --- a/tests/ordering/tests.py +++ b/tests/ordering/tests.py @@ -485,7 +485,7 @@ class OrderingTests(TestCase): def test_deprecated_values_annotate(self): msg = ( "Article QuerySet won't use Meta.ordering in Django 3.1. Add " - ".order_by('-pub_date', 'headline', OrderBy(F(author__name), " + ".order_by('-pub_date', F(headline), OrderBy(F(author__name), " "descending=False), OrderBy(F(second_author__name), " "descending=False)) to retain the current query." )