Refs #30557 -- Fixed crash of ordering by ptr fields when Meta.ordering contains F() expressions.

Thanks Can Sarıgöl for the report.

Follow up to 8c5f9906c5.
This commit is contained in:
Mariusz Felisiak 2019-07-11 13:40:36 +02:00 committed by GitHub
parent 8c5f9906c5
commit 7a42cfcfdc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 4 additions and 2 deletions

View File

@ -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

View File

@ -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')),
)

View File

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