2009-06-11 63 views
37

我目前正在学习Django,并且我的一些模型有自定义方法以获取以特定方式格式化的值。是否有可能使用我已经在order_by()模型中定义为属性的这些自定义方法之一的值?在order_by()中使用Django自定义模型方法属性

下面是一个演示如何实现该属性的示例。

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正确的方法是什么?

回答

62

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

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

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

或做了排序在Python:

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

也许`F()`对象将在这种情况下工作。还没有测试过,但是可能用'F('first_name')+''+ F('last_name')'来排序? – 2011-12-14 20:23:48

相关问题