5

Django でモデルを定義しています。オブジェクトのカスタム メソッドをいくつか定義したいと考えていQuerySetます。(つまり、そのモデルにのみ特有の方法で、そのオブジェクトのインスタンスをフィルター処理するカスタムの方法を定義したいと考えています。)

でこれらを定義できますManagerが、これらのメソッドは でのみアクセスでき、そのモデルでのあらゆる種類のフィルタリングの結果であるManagerシングルではアクセスできません。QuerySet

QuerySetでは、モデルのオブジェクトにカスタム フィルタリング メソッドを与えるにはどうすればよいでしょうか。

4

2 に答える 2

8

フィルターチェーンが必要な場合は、extend Queryset.

私の現在のプロジェクトの一例:

from django.db import models
from django.db.models.query import QuerySet

class MemberQuerySet(QuerySet):

    def in_group(self, group):
        return self.filter(group_set__pk=group.pk)

    def not_in_group(self, group):
        return self.exclude(groups_set__pk=group.pk)

class MemberManager(models.Manager):

    def get_queryset(self):
        return MemberQuerySet(self.model, using=self._db)

    def in_group(self, group):
        return self.get_queryset().in_group(group)

    def not_in_group(self, group):
        return self.get_queryset().not_in_group(group)

class Member(models.Model):

    # ...

    objects = MemberManager()

これにより、次のことができます。

Member.objects.in_group(one_group).not_in_group(another_group)

フィルター チェーンが必要ない場合は、カスタム メソッドを持つマネージャーで十分です。これはdocsで十分にカバーされています。

このスニペットQuerySetはプラグインの高速化に適しているようですが、古い (4 年) ため、試したことはありません

于 2013-05-16T00:41:11.373 に答える