如果需要过滤器链接扩展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中得到了很好的报道.
This snippet对于更快的QuerySet插件看起来不错,但它已经很久了(4年)而且我从未尝试过它.