代码之家  ›  专栏  ›  技术社区  ›  Andre Miller

按顺序使用django自定义模型方法属性

  •  38
  • Andre Miller  · 技术社区  · 15 年前

    我目前正在学习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 回复  |  直到 9 年前
        1
  •  63
  •   Daniel Roseman    15 年前

    不,你不能那样做。 order_by 是在数据库级别应用的,但数据库对自定义的Python方法一无所知。

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

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

    或者在python中进行排序:

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