2011-07-26 9 views
1

だから私はほとんどのドキュメントを読んできたので、もう少し調べてみましたが、私の質問に対する答えを見つけることはできません。私はコードから始めます。私が遊んでた間Djangoマネージャの順番はどのような機能ですか?

# Manager 
class ActiveManager(models.Manager): 
    def get_query_set(self): 
     return super(ActiveManager, self).get_query_set().filter(is_active=True) 
# Model 
class ModelA(models.Model): 
    # ... 
    is_active = models.BooleanField() 
    objects = ActiveManager() 
    all_objects = models.Manager() 

だから、私はそれをこのように書いたとget_object_or_404()使用した場合、それはすべてのアクティブレコードに最初の検索にActiveManagerを使用し、その後に関連する1つを返すことに気づきました私の質問。私は経営者の順序を切り替える場合は、:

class ModelA(models.Model): 
    # ... 
    all_objects = models.Manager() 
    objects = ActiveManager() 

そして、それは、クエリを実行するために、この場合all_objectsには、デフォルトのマネージャーを使用しています。私はこの他の機能がどのような影響を与えるのだろうかと思っています。

編集:私は最初のマネージャがデフォルトのマネージャーになっクラスで見つかったことを理解し、私は特定の機能は、このデフォルトの管理者(のようなget_object_or_404)を使用していると思いまして

答えて

2

ここではドキュメントから該当するビットがあります:"If you use custom Manager objects, take note that the first Manager Django encounters (in the order in which they're defined in the model) has a special status. Django interprets the first Manager defined in a class as the "default" Manager, and several parts of Django (including dumpdata) will use that Manager exclusively for that model. As a result, it's a good idea to be careful in your choice of default manager in order to avoid a situation where overriding get_query_set() results in an inability to retrieve objects you'd like to work with"

the way get_object_or_404 is implementedを参照すると、モデルの属性_default_managerが使用されます。これは、Djangoが最初に検出されたマネージャを参照する方法です。 (私が知る限り、Djangoの内部はすべてこのように動作します。Model.objectsなどを使用することはありません。なぜなら、デフォルトマネージャがobjectsと呼ばれることは想定してはいけないからです。

+0

そうですが、私はそれを読んでいましたが、どの特定のものが_default_managerを使用するのか不思議に思っていました。最も一般的なものはおそらく十分でしょう –

+0

@Bryce Siedschlaw、コードの唯一の場所で、モデルの 'objects'属性を参照するDjangoが見つかりました(つまり、動的に渡されたものです。もちろん、' User .objects'、 'Site.objects'など)は[ここ](https://code.djangoproject.com/browser/django/trunk/django/views/generic/create_update.py#L78)です(ただし、関数ベースとにかく一般的なビューは廃止予定です)。特に、ジェネリックビューはデフォルトで '_default_manager'を使用します。 –

+0

あなたは、 '_default_manager'を使用する特定の一般的に使用されている関数を偶然知っているのではないでしょうか? 'get_object_or_404'に似ています。 –

0

多くのことに影響します。マネージャーのデフォルト名はobjectsですが、これはデフォルトですが必須ではありません。モデル定義にobjectsを含めず、マネージャーをall_objectsと定義した場合、ModelA.objectsは存在しません。 Djangoはモデルに他のマネージャが存在せず、あなた自身でobjectsを定義していない場合にのみデフォルトマネージャを割り当てます。

とにかく、Djangoはモデルで定義された最初のマネージャを取り、 "デフォルト"を呼び出し、後で "default"マネージャを使用します。これはいつでもモデルのマネージャを参照する必要がありますobjectsが定義されていない可能性があるので、単にobjectsを使用してください)。

大雑把に言うと、Djangoが使用する標準のマネージャー(ある意味では、最も一般的に使用されるマネージャー)は、objectsに割り当てられているかどうかにかかわらず、最初に定義されたものでなければなりません。他のすべてのマネージャーはそれ以降に来るべきです。

+0

私はisbadawiに言ったように、私はドキュメントのそれらの部分を読んで、すべてを理解しています。私は、どの特定の関数がモデルのデフォルトマネージャ( 'get_object_or_404'など)を使用しているのか不思議に思っていました。そうすれば、私はそれらを追跡し、彼らが私が望むことをやっていることを確認することができます。それは質問で指定しないと私のせいです。 –

+0

私たちが作り出していることは、それがすべてであるということです。 Djangoは決して 'オブジェクト 'を直接呼び出すことはありません。したがって、ルックアップを行うメソッドであれば、デフォルトのマネージャを使用します。 –

関連する問題