非常に頻繁に次のような構造を目にします
MyModel.objects.all().filter(...)
デフォルトの Mananger の QuerySet を返します。最初all()
はかなり冗長に思えます。
MyMode.objects.filter(...)
同じ結果をもたらします。
ただし、Django のドキュメントに次の 2 つのステートメントがあるため、これはデフォルトの Manager に対してのみ安全であるように思われます。
「追加のマネージャ メソッドの追加」の章からの抜粋
カスタム Manager メソッドは、必要なものを何でも返すことができます。QuerySet を返す必要はありません。
all()
manager メソッドの定義:
all() 現在の QuerySet (または QuerySet サブクラス) のコピーを返します。これは、モデル マネージャまたは QuerySet のいずれかを渡して、結果をさらにフィルタリングする必要がある場合に役立ちます。いずれかのオブジェクトで all() を呼び出した後は、操作する QuerySet が確実に得られます。
これは私には少し矛盾しているように思えます。一方では、Django はマネージャ メソッドが任意のオブジェクト タイプを返すようにする自由を提供し、他方ではall()
メソッドに QuerySet を必要とします。各マネージャーには、get_queryset
によって呼び出されるメソッドがあることを認識していall()
ます。all()
しかし、カスタム マネージャーでオーバーライドするのを誰が止めますか? 私は同意しますが、そうするのは悪い設計になるでしょう。
私が見る限り、この
all()
メソッドは QuerySet を返すことを保証していません。正確には何をMyModel.objects
返しますか?このステートメントは を呼び出しall()
ますか? または `get_queryset()?あなたはどちらを好みます
MyModel.objects.filter(...)
かMyModel.objects.all().filter(...)
?もしそうなら、なぜですか?望ましくない方法でこれらのメソッドを台無しにする不安定なマネージャーに遭遇したことがありますか?