2010-12-15 12 views
5

次のモデルのマネージャーを宣言しましたが、そのあとでList.objects.get()を使用できなくなりました。誰も知っている理由は?なぜマネージャをDjangoモデルに宣言するのですか?void "objects"

class List(models.Model): 
    title = models.CharField(max_length=20, unique=True) 
    archived = models.BooleanField() 

    archived_lists = ArchivedListManager() 
    active_lists = ActiveListManager() 

とマネージャー:

class ArchivedListManager(models.Manager): 
    def get_query_set(self): 
    return super(ArchivedListManager, self).get_query_set().filter(archived=True) 

class ActiveListManager(models.Manager): 
    def get_query_set(self): 
    return super(ActiveListManager, self).get_query_set().filter(archived=False) 

エラーがtype object 'List' has no attribute 'objects'

答えて

19

カスタムManagerオブジェクトを使用する場合は、最初のManager Djangoは(彼らはモデルで定義されていた順序で)遭遇したことに注意して取ります特別な地位を有する。 Djangoはクラス内で最初に定義されたManagerを「デフォルト」Managerと解釈し、Djangoのいくつかの部分はそのモデルのためにそのManagerを排他的に使用します。結果として、get_query_set()を無効にすると、作業したいオブジェクトを取り出すことができないという状況を避けるために、デフォルトマネージャの選択に注意することは良い考えです。

"なぜ"になるかは、あなた自身のデフォルトマネージャを提供できるようにすることです。

ソリューションは、しかし、簡単です:ちょうどあなたのモデルクラスにこの

objects = models.Manager() 

を追加します。

0

独自の管理者を追加すると、在庫マネージャの作成を抑制しています。 Django docsで述べたように

"Manager names"

+0

私はこのマネージャを "class ListManager(models.Manager): def get_query_set(self): return super(ListManager、self).get_query_set()"というList.objectsで正しいオブジェクトを出力しますが失敗します"List.objects.get(example = example)どうすれば修正できますか? – Josh

+0

これはまったく別の質問のようです。 –

関連する問題