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
相关产品推荐
相关产品推荐

