在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方法一无所知。

你可以使用单独的字段进行排序:

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

或在Python中进行排序:

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

以上是 在order_by()中使用Django自定义模型方法属性 的全部内容, 来源链接: utcz.com/qa/428827.html

回到顶部