我正在尝试创建一个自定义函数,我可以放在一个查询集“链”中,它将过滤器应用于查询集。与普通的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/