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."
         )