基于变量(str)的Django动态过滤器

时间:2018-09-19 14:56:39

标签: python django filter

我正在编写一个函数,该函数可以基于动态插入的模型返回表项。因此,我需要避免在函数中使用模型名称。现在,我有时会与其他模型建立多对多关系,并希望在该模型上进行选择。

说我的文件模型中有一个项目= ManyToMany(Projects)字段。现在我可以使用:

filter(projects__in=[1])

选择与ID为1的项目相关的文件,但我需要此过滤器的项目部分是动态的,因此可以使用类似以下内容的东西:

a_field = 'projects'
filter(a_field+'__in'=[1])

显然不起作用。我该怎么办?

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])