Django中如何通过Serializer序列化JSON请求数据,source参数不生效如何解决?
问题原因
你当前配置中的source参数本身是有效的,报错的核心原因是请求里的业务字段都嵌套在data键下,而你直接把完整请求数据传给了序列化器,序列化器默认会从传入数据的顶层查找对应字段,自然无法匹配到嵌套层的phoneNumber等参数,因此触发必填校验报错。
解决方法
有两种常用方案可以适配你的请求结构:
方案1:手动提取嵌套层传入序列化器
在视图中实例化序列化器时,先取出请求里的data内层对象再传入即可,示例代码:
# 视图中的校验逻辑 serializer = VerifyOtpSerializer(data=request.data.get("data", {})) serializer.is_valid(raise_exception=True) # 后续直接使用 serializer.validated_data 就能拿到 snake_case 命名的解析字段
该方案无需修改现有序列化器定义,你写的source映射配置可以直接生效。
方案2:新增外层序列化器适配请求结构
如果不想每次手动提取内层数据,可以新增一个嵌套序列化器适配外层的data包装结构:
class VerifyOtpSerializer(serializers.Serializer): phone_number = serializers.CharField(max_length=225, source='phoneNumber', required=True) country_code = serializers.CharField(max_length=225, source='countryCode', required=True) otp = serializers.CharField(max_length=255, required=True) # 新增外层序列化器 class VerifyOtpRequestSerializer(serializers.Serializer): data = VerifyOtpSerializer(required=True)
视图中直接传入完整请求数据校验即可:
serializer = VerifyOtpRequestSerializer(data=request.data) serializer.is_valid(raise_exception=True) # 校验通过后通过以下方式获取业务字段 validated_data = serializer.validated_data['data']
额外校验项
如果按照上述方案调整后仍有报错,可以检查两个配置:
- 确认请求头的
Content-Type已经设置为application/json,避免请求数据解析异常 - 确认请求中的字段名拼写和
source配置完全一致,没有大小写、拼写错误
内容的提问来源于stack exchange,提问作者Mohit Kumar
相关产品推荐
相关产品推荐

