フィルターチェーンが必要な場合は、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 年) ため、試したことはありません。