Django REST Framework跨用户更新用户信息失败,保存未生效
解决DRF更新用户信息后数据库未保存的问题
我仔细看了你的代码和请求细节,大概率问题出在请求的Content-Type头缺失上,下面给你拆解原因和解决方案:
核心问题分析
你的curl请求里没有指定Content-Type: application/json,而DRF默认会以JSON格式解析请求体。当你用-d传递JSON数据但没设置这个头时,curl会默认使用application/x-www-form-urlencoded格式发送数据,DRF无法正确解析,导致request.data里没有perfil字段。
这时候序列化器虽然通过了is_valid()校验(因为序列化器会 fallback 使用原instance的perfil值),但validated_data是空的,调用serializer.save()时不会更新任何字段,数据库自然没变化,返回的还是原来的perfil值。
解决方案
1. 修正curl请求,添加Content-Type头
把你的curl命令改成这样:
curl -X PUT 'http://localhost:8080/empresa/usuario/15/' -H 'Authorization: JWT MY_TOKEN' -H 'Content-Type: application/json' -d '{"perfil":"B"}'
添加-H 'Content-Type: application/json'后,DRF就能正确解析JSON格式的请求体,获取到perfil字段的值,序列化器就能正常更新数据库了。
2. 额外排查点(可选)
如果添加头后还是有问题,可以做以下检查:
- 在视图里打印
request.data,确认是否正确获取到了perfil值:def put_user(request, pk): print(request.data) # 打印看看有没有perfil字段 # 其余代码... - 重写序列化器的
update方法,手动确认更新逻辑:class UpdateUserPerfilSerializer(serializers.ModelSerializer): # ... 原代码 ... def update(self, instance, validated_data): # 打印validated_data,确认是否有值 print(f"Validated data: {validated_data}") instance.perfil = validated_data.get('perfil', instance.perfil) instance.save() return instance
这样能帮你快速定位是数据解析的问题,还是更新逻辑的问题。
内容的提问来源于stack exchange,提问作者Danilo Andrade
相关产品推荐
相关产品推荐

