web-dev-qa-db-ja.com

order_by()でDjangoカスタムモデルメソッドプロパティを使用する

私は現在Djangoを学んでおり、一部のモデルには特定の方法でフォーマットされた値を取得するためのカスタムメソッドがあります。私が定義したこれらのカスタムメソッドの1つの値を使用することは可能ですか? 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を使用する正しい方法は何でしょうか?

40
Andre Miller

いいえ、それはできません。 order_byはデータベースレベルで適用されますが、データベースはカスタムPythonメソッドについて何も知りません。

個別のフィールドを使用して注文できます。

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

またはPythonで順序付けを行います。

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