Django模型查询集过滤器作为一个函数

Posted

技术标签:

【中文标题】Django模型查询集过滤器作为一个函数【英文标题】:Django model queryset filter as a function 【发布时间】:2011-06-23 18:58:11 【问题描述】:

我正在尝试创建一个自定义函数,我可以将它放在一个查询集“链”中,它将过滤器应用于查询集。与普通的 Django 查询集过滤器一样,它将查询集放在它的左侧,并将生成的查询集传递到右侧。

在将我的自定义函数添加到查询集链之前:

models.MyModel.objects.all()
models.MyModel.objects.some_manger_function()
models.MyModel.objects.some_manger_function().count()
models.MyModel.objects.some_manger_function().filter(title='something')

将我的自定义函数添加到查询集链后:

models.MyModel.objects.all().my_custom_filter()
models.MyModel.objects.some_manger_function().my_custom_filter()
models.MyModel.objects.some_manger_function().my_custom_filter().count()
models.MyModel.objects.some_manger_function().my_custom_filter()\
   .filter(title='something')

我不确定如何构建我的函数来执行此操作。它周围需要某种装饰器吗?

???? def my_custom_filter(???):
????    return qs.filter(id__gte=10)  

有没有人知道实现此目的的好方法?

以下可能会起作用,但我希望有一些更像 Django 的东西。

def my_custom_filter(qs):
    return qs.filter(id__gte=1)

my_custom_filter(models.MyModel.objects.all()).count()

非常感谢任何建议。

谢谢, 乔

更新:我正在尝试找出 Ignacio 解决方案的细节。我没有对 QuerySet 覆盖做太多事情,所以我正在拼凑我能找到的东西......

class MyQuerySet(QuerySet):

    def filter(self, *args, **kwargs):
        return super(self.__class__, self).filter(*args, **kwargs).\
                     filter(id__gt=5)


class MyManager(models.Manager):

    def testqs(self):
        return MyQuerySet(self.model)

但是,我认为这并不符合我的预期。有什么建议?

>>> models.MyModel.objects.testqs().filter()

更新 2: 这篇文章被证明是有用的。 http://zmsmith.com/2010/04/using-custom-django-querysets/

【问题讨论】:

+1 为 update2 中的链接,对我也有帮助。 【参考方案1】:

您需要编写自己的 QuerySet 子类并添加方法,然后是 use that class in the manager。

【讨论】:

以上是关于Django模型查询集过滤器作为一个函数的主要内容,如果未能解决你的问题,请参考以下文章

Django 数据库操作

django基础知识之模型查询:

使用 ORM Django 过滤新更新的查询集返回空查询集

Django过滤与其他模型的外键相关的模型的查询集?

两列连接后的 Django 查询集过滤器

Django数据操作