You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django新手如何优化按表单参数动态过滤表数据的冗余代码

Django动态表筛选优雅实现方案

优化后代码

def get_queryset(self):
    # 1. 定义配置映射,后续新增条件/字段只需要修改这里
    CONDITION_MAP = {
        'contains': 'icontains',
        'greater': 'gt',
        'lower': 'lt',
        'equals': 'exact'
    }
    ALLOWED_COLUMNS = {'title', 'quantity', 'distance'}
    # 数值类型字段,用于后续类型转换
    NUMERIC_FIELDS = {'quantity', 'distance'}

    # 2. 取请求参数
    column = self.request.GET.get('column')
    condition = self.request.GET.get('condition')
    search_val = self.request.GET.get('title')
    queryset = Table.objects.all()

    # 3. 参数合法性校验,不满足直接返回全量数据(也可按需求返回空)
    if not all([column, condition, search_val]):
        return queryset
    if column not in ALLOWED_COLUMNS or condition not in CONDITION_MAP:
        return queryset

    # 4. 数值字段类型转换,避免字符串传入数值字段过滤报错
    if column in NUMERIC_FIELDS:
        try:
            search_val = int(search_val)
        except (ValueError, TypeError):
            return queryset

    # 5. 动态构造过滤参数,直接查询
    filter_key = f"{column}__{CONDITION_MAP[condition]}"
    queryset = queryset.filter(**{filter_key: search_val})

    return queryset

核心优化点

  • 彻底消除冗余if分支,新增过滤条件或允许字段只需修改顶部的配置映射,不需要改动业务逻辑
  • 增加了字段白名单校验,避免用户传入非法字段触发ORM异常,杜绝SQL注入风险
  • 新增数值类型转换逻辑,修复原代码中数值字段传入字符串过滤可能报错的隐藏问题
  • 代码可维护性大幅提升,配置和逻辑完全分离

扩展说明

如果后续前端调整参数规则,把搜索值的参数名改成和选中列名对应(比如选quantity就传quantity=xxx),只需要把search_val = self.request.GET.get('title')改成search_val = self.request.GET.get(column)即可。

内容的提问来源于stack exchange,提问作者boldRichard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 14:18:05