From db7d7901eeacf37f0a6f124e3733c4f121a23e76 Mon Sep 17 00:00:00 2001 From: ruchit2801 Date: Fri, 17 May 2019 13:00:57 +0530 Subject: [PATCH] [2.2.x] Fixed #30463 -- Fixed crash of deprecation message when Meta.ordering contains expressions. Regression in 1b1f64ee5a78cc217fead52cbae23114502cf564. Backport of 04042b2b440f0bf50eb908d52cfe76af430e1738 from master --- django/db/models/sql/compiler.py | 4 ++-- docs/releases/2.2.2.txt | 3 +++ tests/ordering/models.py | 8 +++++++- tests/ordering/tests.py | 4 +++- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py index bfdf26d4db..f0daffe5c5 100644 --- a/django/db/models/sql/compiler.py +++ b/django/db/models/sql/compiler.py @@ -561,9 +561,9 @@ class SQLCompiler: # order_by = None warnings.warn( "%s QuerySet won't use Meta.ordering in Django 3.1. " - "Add .order_by('%s') to retain the current query." % ( + "Add .order_by(%s) to retain the current query." % ( self.query.model.__name__, - "', '".join(self._meta_ordering) + ', '.join(repr(f) for f in self._meta_ordering), ), RemovedInDjango31Warning, stacklevel=4, diff --git a/docs/releases/2.2.2.txt b/docs/releases/2.2.2.txt index 928624a753..377abaa3c0 100644 --- a/docs/releases/2.2.2.txt +++ b/docs/releases/2.2.2.txt @@ -11,3 +11,6 @@ Bugfixes * Fixed a regression in Django 2.2 that stopped Show/Hide toggles working on dynamically added admin inlines (:ticket:`30459`). + +* Fixed a regression in Django 2.2 where deprecation message crashes if + ``Meta.ordering`` contains an expression (:ticket:`30463`). diff --git a/tests/ordering/models.py b/tests/ordering/models.py index 85e8c59bb6..8b71983c44 100644 --- a/tests/ordering/models.py +++ b/tests/ordering/models.py @@ -14,6 +14,7 @@ undefined -- not random, just undefined. """ from django.db import models +from django.db.models.expressions import OrderBy class Author(models.Model): @@ -30,7 +31,12 @@ class Article(models.Model): pub_date = models.DateTimeField() class Meta: - ordering = ('-pub_date', 'headline') + ordering = ( + '-pub_date', + 'headline', + models.F('author__name').asc(), + OrderBy(models.F('second_author__name')), + ) def __str__(self): return self.headline diff --git a/tests/ordering/tests.py b/tests/ordering/tests.py index 16e5cc9b2d..f0c4bba999 100644 --- a/tests/ordering/tests.py +++ b/tests/ordering/tests.py @@ -408,7 +408,9 @@ 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') to retain the current query." + ".order_by('-pub_date', 'headline', OrderBy(F(author__name), " + "descending=False), OrderBy(F(second_author__name), " + "descending=False)) to retain the current query." ) with self.assertRaisesMessage(RemovedInDjango31Warning, msg): list(Article.objects.values('author').annotate(Count('headline')))