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

And*_*ler 40 python django django-models

我目前正在学习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
Run Code Online (Sandbox Code Playgroud)

有了这个模型,我可以做到:

>>> 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>]
Run Code Online (Sandbox Code Playgroud)

但我做不到:

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

在像这样的自定义属性上使用order_by的正确方法是什么?

Dan*_*man 66

不,你做不到.order_by在数据库级别应用,但数据库无法了解有关自定义Python方法的任何信息.

您可以使用单独的字段来订购:

Author.objects.order_by('first_name', 'last_name')
Run Code Online (Sandbox Code Playgroud)

或者在Python中进行排序:

sorted(Author.objects.all(), key=lambda a: a.full_name)
Run Code Online (Sandbox Code Playgroud)

  • 对于`sorted(CGHSSection.objects.all(), key=lambda a: a.modtitle)`,我得到`TypeError: '&lt;' not supported between 'method' and 'method'` (2认同)