2009-06-11 8 views
37

私は現在Djangoを学んでおり、私のモデルの中には、特定の方法でフォーマットされた値を取得するためのカスタムメソッドがあります。 order_by()でモデルのプロパティとして定義したこれらのカスタムメソッドの1つの値を使用することは可能ですか?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')'で注文していますか? –

+0

_multiple_カスタムフィールドを 'sorted'でソートするには、https://wiki.python.org/moin/HowTo/Sortingで説明されているようにkey = attrgetterを使用できます。 – Chirael

関連する問題