1

それで、私はほとんどのドキュメントを読み、SOを少し調べてきましたが、私の質問に対する答えを完全に見つけることができません。コードから始めましょう。

# 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と、最初にすべてのアクティブなレコードを検索してから、クエリに関連するレコードを返すことに気付きました。ただし、マネージャーの順序を入れ替えた場合:

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

次に、デフォルトのマネージャー(この場合は)を使用all_objectsしてクエリを実行します。この変更は他にどのような機能に影響を与えるのでしょうか。

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

4

2 に答える 2

2

ドキュメントからの関連ビットは次とおりです。"default" , および Django のいくつかの部分 ( を含む) はそれをそのモデル専用に使用します. そのため, オーバーライドが不可能になる状況を避けるために, デフォルトマネージャーの選択には注意することをお勧めします.操作したいオブジェクトを取得するには"ManagerManagerManagerManagerdumpdataManagerget_query_set() .

way get_object_or_404is implementedを見ると、モデルの属性が使用されてい_default_managerます。これは、Django が最初に遭遇したマネージャーを参照する方法です。(私の知る限り、すべての Django 内部はこのように動作しますModel.objects。デフォルトのマネージャーがたまたま呼び出されると想定してはならないため、 etc.は決して使用しませんobjects)。

于 2011-07-26T15:20:29.087 に答える
0

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

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

経験則では、Django が使用する標準のマネージャー (ある意味では、最も通常使用されるマネージャー) を最初に定義する必要がありobjectsます。他のすべての追加のマネージャーはその後に来る必要があります。

于 2011-07-26T15:21:18.957 に答える