2009-06-11 65 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

相關問題