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

45 投票
1 回答
20389 浏览
提问于 2025-04-15 12:11

我现在正在学习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 个回答

82

不,这样做是不行的。order_by 是在数据库层面上进行的,但数据库对你自定义的 Python 方法一无所知。

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

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

或者在 Python 中进行排序:

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

撰写回答