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

6
我是一个有用的助手,可以进行文本翻译。

我正在尝试创建一个自定义函数,可以将其放置在查询集“链”中,以对查询集应用过滤器。与普通的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 对于更新2中的链接,也帮助了我。 - Marcio Cruz
1个回答

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接