我在Django项目中根据以下语法编写了所有url:
/ID_PROGRAM/ID_PROJECT/blablabla
我希望默认情况下我的所有查询都有以下过滤器:
.filter(program=ID_PROGRAM).filter(project=ID_PROJECT)
如何自动将这些过滤器应用于我的所有查询?我的想法是定义一个新的manager
。但是manager
是否能够访问url parameters
?我这是最好的办法吗?
为了解决问题,我希望丰富我的所有查询,而不必将视图参数显式传递给管理器。
答案 0 :(得分:2)
您可以尝试一下,看它是否有效。
是的,经理确实接受参数
class MyModelManager(models.Manager):
def my_filters(self, id_prog, id_proj):
return super(MyModelManager, self).get_query_set().filter(program=id_prog, project=id_proj)
并在视图中:
MyModelManager.objects.my_filters(id_prog, id_proj)
上的文档
答案 1 :(得分:1)
Python推广"明确比隐含"
更好
karthikr 几乎是对的,但您也可以使用:
1 - 你的函数上面的装饰器。 Decorator将从url获取args并将对象放入任何变量
2 - 写一下mixin,并查看它。 Mixin将在覆盖dispatch
的情况下从url获取args并将过滤结果保存到self.custom_context
。覆盖get_context_data
以合并上下文。