Подтвердить что ты не робот

Использование свойства метода пользовательской модели Django в order_by()

В настоящее время я изучаю Django, и некоторые из моих моделей имеют собственные методы для получения значений, форматированных определенным образом. Можно ли использовать значение одного из этих настраиваемых методов, которое я определил как свойство в модели с order_by()?

Вот пример, демонстрирующий, как реализуется свойство.

class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    email = models.EmailField(blank=True, verbose_name='e-mail')

    def _get_full_name(self):
        return u'%s %s' % (self.first_name, self.last_name)
    full_name = property(_get_full_name)

    def __unicode__(self):
        return self.full_name

С помощью этой модели я могу сделать:

>>> Author.objects.all()
[<Author: John Doh>, <Author: Jane Doh>, <Author: Andre Miller>]
>>> Author.objects.order_by('first_name')
[<Author: Andre Miller>, <Author: Jane Doh>, <Author: John Doh>]

Но я не могу:

>>> Author.objects.order_by('full_name')
FieldError: Cannot resolve keyword 'full_name' into field. Choices are: book, email, first_name, id, last_name

Каким будет правильный способ использования order_by для пользовательского свойства, подобного этому?

4b9b3361

Ответ 1

Нет, вы не можете этого сделать. order_by применяется на уровне базы данных, но база данных ничего не знает о ваших пользовательских методах Python.

Вы можете либо использовать отдельные поля для заказа:

Author.objects.order_by('first_name', 'last_name')

или сделать заказ в Python:

sorted(Author.objects.all(), key=lambda a: a.full_name)