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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:15:35