データベースからデータを取得している間は Model.Manager しか使用できないため、アプローチが間違っています。そのため、2 つのマネージャーを使用したり、クエリセットでマネージャーを使用しようとするとエラーが発生します。
data = SomeModel.objects.my_manager.all()
また
data = SomeModel.objects.all()
data = data.my_manager.filter(...)
2つのマネージャーを使用できないため、間違っています...
考えられる問題の1つは、クエリセットをパラメーターとして取得し、フィルター処理されたクエリセットを返す関数を定義することです...
def extra_filter(queryset):
queryset = queryset.filter(...)
しかし、これが役立つかどうかはわかりません。
最善の方法は、別のモデル マネージャーを定義し、必要に応じてオブジェクトの代わりに使用することです...
class SomeManager(models.Manager):
def get_query_set(self):
return super(SomeManager, self).get_query_set().filter(<filteer criteria>)
class MyModel(models.Model):
# some fields
objects = models.Manager()
mymanager = SomeManager()
data = MyModel.mymanager.all()
そして、1つだけ使用して...
更新: django では、クエリセットは遅延です。つまり、必要な数のフィルターを適用でき、フィルターから特定のレコードを取得しようとするか、それをスライスしようとしない限り、データはデータベースから取得されません...ドキュメントはこちら
したがって、両者の間に違いはありません
qs = MyModel.objects.filter(field_B__lt=1)
qs = qs.filter(field_A__gt=3)
と
qs = MyModel.objects.filter(field_A__gt=3)
qs = qs.filter(field_B__lt=1)
したがって、特定のフィルタリングを適用するようにマネージャーを定義することが、マネージャーを使用する主な理由です...
マネージャを定義します:
class SomeManager(models.Manager):
def get_query_set(self):
return super(SomeManager, self).get_query_set().filter(field_A__gt=3)
次に、他のフィルタリング基準で呼び出します。
Somemodel.mymodelmanager.filter(field_B__lt=1, ....)
そして、django はすべてのフィルターを追加し、必要に応じてクエリを評価します。
したがって、頻繁に使用するフィルターであれば、manager が最良の選択です...
例として、ほとんどのデータベース モデルに有効な_ フィールドと、無効なエントリをフィルター処理するvalマネージャーがあります。したがって、すべての有効なデータをフィルタリングしたい場合(90%の時間)、使用します
Somemodel.val.filter(...)
そして、すべてのデータが必要な状況では、基本的なdjangoマネージャーを使用するだけです:
Somemodel.objects.filter(...)