diff --git a/server/serializers.py b/server/serializers.py index 7e08caf..a74ae84 100644 --- a/server/serializers.py +++ b/server/serializers.py @@ -109,15 +109,26 @@ class FilterConfigSerializer(serializers.ModelSerializer): read_only_fields = ["id", "created_at", "updated_at"] def to_internal_value(self, data): - """请求中兼容 minAmount/maxAmount、最小金额/最大金额 等别名;支持 multipart/form-data(QueryDict)。""" - # multipart/form-data 时 request.data 是 QueryDict,需转为普通 dict 并统一处理 - data = dict(data) if data is not None else {} + """请求中兼容 minAmount/maxAmount 等别名;支持 multipart/form-data(QueryDict/多值列表)。""" + if data is None: + data = {} + else: + data = dict(data) + # multipart 解析后字段值可能是 list(如 ["测试配置"]),需展平为标量 + for key in list(data.keys()): + val = data[key] + if isinstance(val, (list, tuple)): + data[key] = val[0] if len(val) > 0 else "" for alias, canonical in FILTER_AMOUNT_ALIASES.items(): if alias in data and canonical not in data: data[canonical] = data.pop(alias) - # 请求里 is_active 可能是字符串 "true"/"false"(表单项均为字符串) - if "is_active" in data and isinstance(data.get("is_active"), str): - data["is_active"] = data["is_active"].lower() in ("true", "1", "yes", "是") + # 请求里 is_active 可能是字符串 "true"/"false" 或单元素列表 + raw = data.get("is_active") + if raw is not None: + if isinstance(raw, (list, tuple)): + raw = raw[0] if raw else "" + if isinstance(raw, str): + data["is_active"] = raw.lower() in ("true", "1", "yes", "是") return super().to_internal_value(data)