Django DRF报错:Serializer接收到多个'instance'参数值问题排查
报错原因定位
报错核心原因是序列化器初始化时参数传递顺序错误,给instance参数重复传值了。
你混淆了Django原生表单和DRF(Django REST Framework)序列化器的构造参数规则:
- Django原生Form类构造方法第一个位置参数是用户提交的数据
data - DRF的
ModelSerializer构造方法签名为__init__(self, instance=None, data=empty, **kwargs),第一个位置参数是模型实例instance,第二个位置参数才是提交的数据data
你写的CRUDSerializer(request.POST,instance=Updateemp),等于把request.POST作为第一个位置参数传给了instance,后面又显式传入instance=Updateemp,同一个参数收到了两个值,就抛出了对应的报错。
修正方案
初始化序列化器时严格按照参数顺序传值,或者全程用关键字参数传值避免顺序错误,修正后的视图代码如下:
def updateemp(request,id): Updateemp = EmpModel.objects.get(id=id) # 推荐用关键字参数传值,不会记错顺序 form = CRUDSerializer(instance=Updateemp, data=request.POST) if form.is_valid(): form.save() messages.success(request,'Record Updated Successfully...!:)') return render(request,'Edit.html',{"EmpModel":Updateemp}) # 记得补充校验失败的返回逻辑,否则校验不通过时视图会无响应抛出错误 return render(request,'Edit.html',{"EmpModel":Updateemp, "form":form})
额外注意
如果后续你用序列化器处理JSON格式的请求体,直接取request.POST是拿不到数据的,需要取DRF封装的request.data作为数据源;如果是普通表单提交的场景,request.POST可以正常使用。
内容的提问来源于stack exchange,提问作者Ameya Potdar
相关产品推荐
相关产品推荐

