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

Joe*_*e J 6 django model function filter django-queryset

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

在将自定义函数添加到queryset链之前:

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')
Run Code Online (Sandbox Code Playgroud)

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

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')
Run Code Online (Sandbox Code Playgroud)

我不知道如何构建我的函数来做到这一点.它周围需要某种装饰器吗?

???? def my_custom_filter(???):
????    return qs.filter(id__gte=10)  
Run Code Online (Sandbox Code Playgroud)

有谁知道一个很好的方法来实现这一目标?

以下可能会有效,但我希望能有更像Django的东西.

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

my_custom_filter(models.MyModel.objects.all()).count()
Run Code Online (Sandbox Code Playgroud)

任何建议都非常感谢.

谢谢,乔

更新:我正在尝试解决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)
Run Code Online (Sandbox Code Playgroud)

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

>>> models.MyModel.objects.testqs().filter()
Run Code Online (Sandbox Code Playgroud)

更新2:本文证明是有用的. http://zmsmith.com/2010/04/using-custom-django-querysets/

Ign*_*ams 4

您将需要编写自己的QuerySet子类并添加该方法,然后在管理器中使用该类