我正在编写一个函数,该函数可以基于动态插入的模型返回表项。因此,我需要避免在函数中使用模型名称。现在,我有时会与其他模型建立多对多关系,并希望在该模型上进行选择。
说我的文件模型中有一个项目= ManyToMany(Projects)字段。现在我可以使用:
filter(projects__in=[1])
选择与ID为1的项目相关的文件,但我需要此过滤器的项目部分是动态的,因此可以使用类似以下内容的东西:
a_field = 'projects'
filter(a_field+'__in'=[1])
显然不起作用。我该怎么办?
答案 0 :(得分:3)
您可以通过在Python中使用conda list -n <env>
来做到这一点:构造一个将字符串(参数名称)映射为值的字典,然后使用带有两个星号的字典来调用该函数,例如:
**kwargs
我们当然需要在单独的行上构造字典:
a_field = 'projects'
params = {a_field+'__in': [1]}
filter(**params)
因此,如果您有一个像a_field = 'projects'
filter(**{a_field+'__in': [1]})
这样的字典,那么用{'foo': 'bar', 'qux': 14}
来调用它等同于foo(**{'foo': 'bar', 'qux': 14})
。该技术不是特定于Django的,而是特定于Python的。 Python还提供了一种方法来使用 positional 参数:foo(foo='bar', qux=14)
等效于foo(*[1, 'a', 4])
。