3

次のケースを検討してください。

class MyModelManager(models.Manager):
    def my_filter(self):
     return [some code here].filter(field_A__gt=3)

class MyModel(models.Model):
    # some fields
    objects = MyModelManager()


# The way I'd like to use it:
qs = MyModel.objects.filter(field_B__lt=1)
# some code
qs = qs.my_filter()

my_filter()既にフィルター処理されたクエリセットでカスタム関数を使用したいことに注意してください。上記にどのコードを配置すればよい[some code here]ですか?全体の構造は正しいですか?

4

3 に答える 3

2

正確にこの方法で行う方法はないと思います。MyModel.objects.filter(field_B__lt=1) は、MyModelManager ではなく、QuerySet オブジェクトを返します。Ignacio Vazquez-Abrams が言及したように my_filter メソッドに渡すか、最初に my_filter をマネージャーに適用すると、さらにフィルター処理できる QuerySet オブジェクトが返されます。

于 2011-04-28T09:14:56.040 に答える
1

データベースからデータを取得している間は 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(...)
于 2011-04-28T11:56:03.183 に答える
0
class MyModelManager(models.Manager):
    def my_filter(self, qs=None):
        if qs is None:
            qs = [however you got it before]
        return qs.filter(field_A__gt=3)

次に、クエリセットをそれに渡します。

于 2011-04-28T09:11:20.553 に答える