#30463: Deprecation message generates error when query expression is used in
Meta.ordering
-------------------------------------+-------------------------------------
               Reporter:  Jannis     |          Owner:  nobody
                   Type:             |         Status:  new
  Uncategorized                      |
              Component:  Database   |        Version:  2.2
  layer (models, ORM)                |
               Severity:  Normal     |       Keywords:  ordering
           Triage Stage:             |      Has patch:  0
  Unreviewed                         |
    Needs documentation:  0          |    Needs tests:  0
Patch needs improvement:  0          |  Easy pickings:  1
                  UI/UX:  0          |
-------------------------------------+-------------------------------------
 Since updating to Django 2.2 our test suite fails because the newly
 introduced deprecation warning which warns about Meta.ordering being
 ignored from Django 3.1 onwards leads to errors when a query expression is
 used.

 Take a model definition like this as an example:


 {{{
 class Book
     name = models.CharField(max_length=255)

     class Meta:
         ordering = [F('name',).asc()]

 }}}

 The error happens here:

 {{{
 File "django/django/db/models/sql/compiler.py", line 558, in as_sql
     "', '".join(self._meta_ordering)
 TypeError: sequence item 0: expected str instance, OrderBy found
 }}}

 A quick and dirty way around that problem is to join the string
 representations of all the list items instead of concatenating them
 directly:

 {{{
     warnings.warn(
         "%s QuerySet won't use Meta.ordering in Django 3.1. "
         "Add .order_by('%s') to retain the current query." % (
             self.query.model.__name__,
             "', '".join([str(f) for f in self._meta_ordering])
         ),
     )
 }}}

 Unfortunately this doesn't generate real source code compatible with
 `.order_by()` because the quotation marks are not correct.
 Maybe someone else has a clean solution on how to fix this?

 {{{
 - Book QuerySet won't use Meta.ordering in Django 3.1. Add
 .order_by('name', 'OrderBy(F(price), descending=False)') to retain the
 current query.
 -                                   -
 + Book QuerySet won't use Meta.ordering in Django 3.1. Add
 .order_by('name', OrderBy(F('price'), descending=False)) to retain the
 current query.
 }}}


 A regression test is available here: https://github.com/jnns/django/tree
 /meta-ordering-deprecation-warning

-- 
Ticket URL: <https://code.djangoproject.com/ticket/30463>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/047.054645fc694fbe37cdfdaf8ce0c7d121%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to