13

Djangoカスタムモデルマネージャーを使用する正しい方法について混乱しています-ドキュメントに基づいて、フィルタリングの方法として1つのモデルの一連のマネージャーを作成できます。しかし、フィルタリング用の一連の関数を使用して1つのマネージャークラスを作成してみませんか?一方の方法はもう一方の方法よりも優れていますか?なぜ?

例えば:

class MaleManager(models.Manager):
    def get_query_set(self):
        return super(MaleManager, self).get_query_set().filter(sex='M')

class FemaleManager(models.Manager):
    def get_query_set(self):
        return super(FemaleManager, self).get_query_set().filter(sex='F')

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    sex = models.CharField(max_length=1, choices=(('M', 'Male'), ('F', 'Female')))
    people = models.Manager()
    men = MaleManager()
    women = FemaleManager()

class PersonManager(models.Manager):
    def males(self):
        return super(MaleManager, self).get_query_set().filter(sex='M')

    def females(self):
        return super(FemaleManager, self).get_query_set().filter(sex='F')

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    sex = models.CharField(max_length=1, choices=(('M', 'Male'), ('F', 'Female')))
    people = PersonManager()

Person.people.females() # to get list of females
Person.people.males() # to get a list of males
4

1 に答える 1

12

最初の方法であなたは書くことができます:

men = Person.men.all()

また

peters_men = Person.men.filter(first_name='Peter')

2番目のメソッドget_query_setは、モデルから「継承」し、カスタマイズせずにクエリセットを返します。2番目の方法を破棄する理由はわかりません。管理インターフェースを使用している場合は、これがサポートされていることを確認する必要があります。

また、2番目の方法では、質問を修正する必要があります。は

class PersonManager(models.Manager):
    def males(self):
        return super(PersonManager, self).get_query_set().filter(sex='M')

django managerのドキュメントを読む:「Manager.get_query_set()メソッドをオーバーライドすることで、マネージャーのベースQuerySetをオーバーライドできます。get_query_set()は、必要なプロパティを持つQuerySetを返す必要があります。」

2017年編集注意してください。get_query_set名前はdjanto1.7からに変更されましたget_querysetマネージャーの初期QuerySetの変更に関する詳細情報

于 2011-11-13T22:53:04.437 に答える