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/
| 归档时间: |
|
| 查看次数: |
4452 次 |
| 最近记录: |