2009-06-11 1 views
37

В настоящее время я изучаю 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 на пользовательские свойства, как это?

ответ

62

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

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

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

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

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

Может быть 'F()' объекты будут работать в этом случае. Не тестировали, но, возможно, упорядочивали по 'F ('first_name') + '' + F ('last_name')'? –

+0

Для сортировки по _multiple_ пользовательским полям с 'sorted' вы можете использовать key = attrgetter, как описано в https://wiki.python.org/moin/HowTo/Sorting – Chirael