Django设置带有变量的过滤器字段

时间:2019-06-06 20:02:04

标签: 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_data["filter_code"]

sales = sales.filter(prod_code__icontains=input_code)

我想做的是通过input_code过滤查询集“ sales”,并根据view_by_choice变量动态定义字段。

类似的东西:

sales = sales.filter(VARIABLE__icontains=input_code)

是否可以这样做?预先感谢。

1 个答案:

答案 0 :(得分:1)

您可以在此处使用dictionary unpacking [PEP-448]

sales = sales.filter(
    **{'{}__icontains'.format(view_by_choice): input_code}
)

假设view_by_choice例如包含'foo',我们首先制作一个字典{ 'foo__icontains': input_code },然后将其作为带有两个连续星号({{1} )。

话虽这么说,我强烈建议您对**做一些验证:请确保有效选项的数量是有限的。否则,用户可能会注入恶意的字段名称,查找等,以利用数据库中应保持隐藏状态的数据。

例如,如果您的模型在view_by_choice模型中有一个名为ForeignKey的{​​{1}},则他/她可以使用owner,从而开始尝试找出哪些电子邮件通过生成大量查询并每次查看该查询返回的值来访问数据库。