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

DRF序列化器为何意外抛出ValidationError验证错误?

问题根源:get_write_serializer调用时参数传递错误

你遇到的这个验证错误,核心原因是在重写get_write_serializer方法时,调用父类方法的方式不正确,导致序列化器接收到的数据完全不符合预期。

让我们拆解一下问题:

  • 你在重写方法里给kwargs添加了many=True,这一步是对的,因为要处理批量数据。
  • 但调用super().get_write_serializer(args, kwargs)的时候,你直接把args(元组)和kwargs(字典)作为两个位置参数传了进去,而不是按照Python的参数解包规则传递。

DRF的get_write_serializer方法内部会把接收到的参数传递给序列化器的构造函数,序列化器的构造函数签名是:

def __init__(self, instance=None, data=empty, **kwargs):

当你直接传args和kwargs时,相当于:

  • instance被赋值为args(也就是原本应该作为data的请求数据元组)
  • data被赋值为kwargs(也就是包含many=True的字典)

这就导致序列化器实际要验证的data是{'many': True},完全没有你POST的id和is_read字段,自然会抛出"字段必填"的验证错误。

修复方法

只需要在调用父类方法时,对args和kwargs进行解包,修改重写的方法:

def get_write_serializer(self, *args, **kwargs):
    kwargs['many'] = True
    # 这里要加*和**来解包参数,确保传递正确
    return super().get_write_serializer(*args, **kwargs)

这样传递参数后,父类方法会正确地把args里的元素作为位置参数(比如data=request.data),把kwargs里的键值对作为关键字参数(比如many=True)传递给序列化器,序列化器就能正确处理你POST的批量数据了。

额外验证建议

你可以在序列化器的is_valid方法里打印self.initial_data来确认:修复后,self.initial_data应该就是你POST的那个列表[{"id": 1, "is_read": true}, {"id": 2, "is_read": false}],而不是之前包含data和many的字典。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:25:33