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

标签 python django orm

我正在 Django 中定义一个模型。我想为其 QuerySet 对象定义一些自定义方法。 (即我想定义自定义方法来过滤该对象的实例,仅以该模型特有的方式。)

现在,我可以在 Manager 上定义这些方法,但是这些方法只能在 Manager 上访问,而不能在任何单个 QuerySet 上访问> 这是对该模型进行任何类型过滤的结果。

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

最佳答案

如果您需要过滤器链接扩展 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 年)并且我从未尝试过

关于python - Django:为特定模型的 `QuerySet`对象提供自定义过滤方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16576756/

相关文章:

python - Django 中的外键关系,带有选择条件

Django:从 ModelAdmin 中访问模型实例?

python - 如何将新的 ".where()"添加到现有的 peewee 查询中?

orm - 使用 Doctrine2 存储动态字段

python - 来自连接的 SQLAlchemy 声明属性(单个属性,而不是整个对象)

python - 如何保存 "for"循环中的值? python 3

python - 如何在python中使用回调函数?

django - 字符串中的 Django 外键和不带字符串的 Django 外键有什么区别?

python - 将 fixture 传递给pytest中的测试类

python - 如何在 virtualenv 中 : Install python2. x?