我试图创建一个自定义函数,我可以将其放置在将应用过滤器到查询集的查询集“链”中。与普通的Django查询集过滤器一样,它将把查询集置于其左侧,并将生成的查询集传递给右侧。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()
任何意见是非常感谢。
谢谢, 乔
更新:我试图找出伊格纳西奥的解决方案的详细信息。我没有与查询集压倒一切,所以我拼凑什么,我能找到做太多...
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()
UPDATE 2: 本文证明是有用的。 http://zmsmith.com/2010/04/using-custom-django-querysets/
+1为更新2中的链接,也帮助我。 – 2012-02-13 18:09:25