2011-02-08 103 views
6

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

+0

+1为更新2中的链接,也帮助我。 – 2012-02-13 18:09:25

回答

4

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

+0

感谢您的建议Ignacio。我已经在上面做了更新。 – 2011-02-08 23:35:10