Django:为特定模型的`QuerySet`对象提供自定义过滤方法

Ram*_*hum 4 python django orm

我在Django中定义了一个模型.我想为它的QuerySet对象定义一些自定义方法.(即我想定义自定义方法来过滤该对象的实例,其方式仅限于该模型.)

现在,我可以在上面定义那些Manager,但是这些方法只能在该模型上进行,Manager而不能QuerySet在该模型上进行任何过滤的任何单独访问.

那么:我如何给出QuerySet模型自定义过滤方法的对象?

Adr*_*ián 5

如果你需要过滤链延长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()
Run Code Online (Sandbox Code Playgroud)

有了这个你可以做:

Member.objects.in_group(one_group).not_in_group(another_group)
Run Code Online (Sandbox Code Playgroud)

如果您不需要过滤器链接,那么使用自定义方法的经理就足够了.这在文档中已经很好地介绍了.

这段代码似乎很适合更快的QuerySet插件,但它已经很久了(4年)而我从未尝试过.