在order_by()中使用Django自定义模型方法属性

我目前正在学习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的正确方法是什么?

不,你不能这样做。 order_by应用于数据库级别,但数据库无法知道任何有关您的自定义Python方法的信息。

您可以使用单独的字段进行sorting:

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

或者在Python中进行sorting:

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