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

