Использование свойства метода пользовательской модели 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 для такого свойства?
1 ответ
Решение
Нет, ты не можешь этого сделать. order_by
применяется на уровне базы данных, но база данных не может ничего знать о ваших пользовательских методах Python.
Вы можете использовать отдельные поля для заказа:
Author.objects.order_by('first_name', 'last_name')
или сделать заказ в Python:
sorted(Author.objects.all(), key=lambda a: a.full_name)