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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 00:27:02