我正在编写一个函数,可以根据动态插入的模型返回表项。所以我需要避免在函数中使用模型名称。现在,我有时会与另一个模型建立多对多关系,并希望对其进行选择。
假设我的文件模型中有一个 items = ManyToMany(Projects) 字段。现在我可以使用:
filter(projects__in=[1])
选择与 id 1 的项目相关的文件,但我需要此过滤器的项目部分是动态的,因此我可以使用如下内容:
a_field = 'projects'
filter(a_field+'__in'=[1])
这显然不起作用。我该怎么做?
最佳答案
您可以使用 **kwargs
来执行此操作在Python中:构建一个字典,将字符串(参数的名称)映射到值,然后使用带有两个星号的字典调用该函数,例如:
a_field = 'projects'
<b>params = {a_field+'__in': [1]}</b>
filter(<b>**params</b>)
我们当然需要在单独的行上构造字典:
a_field = 'projects'
filter(<b>**{a_field+'__in': [1]}</b>)
如果你有一本像 {'foo': 'bar', 'qux': 14}
这样的字典,然后用 foo(**{'foo': 'bar', 'qux': 14})
调用它相当于 foo(foo='bar', qux=14)
。该技术并非特定于 Django,而是特定于 Python。 Python 也有一种方法可以使用位置参数来做到这一点:foo(*[1, 'a', 4])
相当于 foo(1, 'a', 4)
.
关于python - Django基于变量(str)的动态过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52408768/