2017-08-28 4 views
1

私はカスタムマネージャーの作成について頭を下ろそうとしています。私はオンライン文書が少ししか見つからなかった。次のようなモデルを考えるカスタムモデルマネージャメソッドとQuerySetメソッドの違いは何ですか?

...

class QuestionQuerySet(models.QuerySet): 
    def QS_first (self): 
     return self.first() 

class QuestionManager(models.Manager): 
    def get_queryset(self): 
     return QuestionQuerySet(self.model, using=self._db) 

    def MN_first(self): 
     return self.get_queryset().first() 


class Question(models.Model): 
    front = models.ForeignKey('Sentence', related_name='question_fronts') 
    .... 

私は、次のような結果を得る...

Grammar.objects.filter(stage=1).question_set.MN_first() 
<Question: [<Sentence: eve gideceğim>, <Sentence: I will go home>]> 

Grammar.objects.filter(stage=1).question_set.QS_first() 
AttributeError: 'RelatedManager' object has no attribute 'QS_first' 

しかし

:コードで自分の周りいじる、私は次のようなパターンを発見しました
Question.objects.filter(grammar=1).QS_first() 
<Question: [<Sentence: eve gideceğim>, <Sentence: I will go home>]> 

Question.objects.filter(grammar=1).MN_first() 
AttributeError: 'QuestionQuerySet' object has no attribute 'MN_first' 

DB関係を介してオブジェクトにアクセスするときにマネージャメソッドが呼び出されるのはなぜですかしかし、Querysetメソッドは、オブジェクトに直接アクセスするときに呼び出されますか? 1つの方法を普遍的なアクセス可能(DRY)にしたい場合は、どのようなソリューションが最適でしょうか?

答えて

1

QuerySet.as_manager()の方法をご覧ください。クエリーセットからマネージャを作成できるため、カスタムマネージャとクエリーセットでコードを複製する必要はありません。

関連する問題