【问题标题】:django setting filter field with a variabledjango 使用变量设置过滤器字段
【发布时间】:2019-10-22 08:57:29
【问题描述】:

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

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)

可以这样做吗?提前致谢。

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    您可以在这里使用dictionary unpacking [PEP-448]

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

    假设view_by_choice 例如包含'foo',因此我们首先创建一个字典{ 'foo__icontains': input_code },然后我们将其解压缩为带有两个连续星号(**)的命名参数。

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

    例如,如果您的模型有一个名为 ownerForeignKeyUser 模型,他/她可以使用 owner__email,然后开始尝试通过生成一个大的查询次数,每次查看查询返回的值。

    【讨论】:

    • 谢谢威廉!它完美地工作。感谢您提供额外的安全建议。
    猜你喜欢
    • 2013-01-19
    • 2012-05-12
    • 1970-01-01
    • 2019-04-04
    • 2012-02-25
    • 2021-08-28
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多