django设置带变量的过滤器字段

django设置带变量的过滤器字段,django,django-queryset,Django,Django Queryset,我展示了一个销售模型,它可以通过一个表单按不同字段进行聚合。产品、客户、类别等 view_by_choice = filter_opts.cleaned_data["view_by_choice"] sales = sales.values(view_by_choice).annotate(........).order_by(......) 在相同的表单中,我有一个字符串输入,用户可以在其中过滤结果。以“产品代码”为例 input_code = filter_opts.cleaned_da

我展示了一个销售模型,它可以通过一个表单按不同字段进行聚合。产品、客户、类别等

view_by_choice = filter_opts.cleaned_data["view_by_choice"]

sales = sales.values(view_by_choice).annotate(........).order_by(......)
在相同的表单中,我有一个字符串输入,用户可以在其中过滤结果。以“产品代码”为例

input_code = filter_opts.cleaned_data["filter_code"]

sales = sales.filter(prod_code__icontains=input_code)
我想做的是通过输入代码过滤queryset“sales”,从view_by_选项变量动态定义字段

比如:

sales = sales.filter(VARIABLE__icontains=input_code)
有可能这样做吗?提前感谢。

您可以使用这里:

sales=sales.filter(
**{{}icontains.格式(按选项查看):输入代码}
)
例如,
view\u by\u choice
包含
'foo'
,因此我们首先制作一个字典
{'foo\uu icontains':input\u code}
,然后用两个连续的星号(
**
)将其解压为命名参数

话虽如此,我强烈建议您对“按用户查看”选项进行一些验证:确保有效选项的数量有限。否则,用户可能会注入恶意字段名、查找等,以利用数据库中本应隐藏的数据进行攻击


例如,如果您的模型对
用户
模型有一个名为
所有者
外键
,那么他/她可以使用
所有者电子邮件
,从而开始尝试通过生成大量查询并每次查看查询返回的值来找出数据库中的电子邮件。

谢谢Williem!它工作得很好。谢谢你额外的安全建议。
sales = sales.filter(
    **{'{}__icontains'.format(view_by_choice): input_code}
)