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

Django REST framework发送PUT请求出现KeyError 'user_id'问题求助

问题根因

你遇到的KeyError: 'user_id'报错由两个逻辑冲突共同导致:

  • 序列化器TestDataTwoSerializer的fields配置仅包含id和test_name,未声明user或user_id字段,所有未在fields中声明的字段都不会进入validated_data
  • 视图层的perform_update方法中,你已经通过serializer.save(user=self.request.user)将当前用户作为额外参数传入,该参数不会被写入validated_data,而是直接作为关键字参数传递给序列化器的update方法

此外你自定义的update方法未按照DRF规范返回更新后的实例,也会导致后续逻辑异常。

解决方法

你完全不需要在序列化器的update方法中处理用户关联逻辑,直接删除自定义的update方法即可,默认父类的update逻辑完全可以满足需求:

class TestDataTwoSerializer(serializers.ModelSerializer):
    class Meta:
        model = TestDataTwo
        fields = (
            "id",
            "test_name",
        )
# 移除原有的自定义update方法

如果你确实需要保留自定义update逻辑做扩展,修改如下即可:

class TestDataTwoSerializer(serializers.ModelSerializer):
    class Meta:
        model = TestDataTwo
        fields = (
            "id",
            "test_name",
        )
    def update(self, instance, validated_data):
        # user参数可直接从请求上下文获取,无需从validated_data读取
        instance.user = self.context['request'].user
        instance.test_name = validated_data.get('test_name', instance.test_name)
        instance.save()
        # 必须返回更新后的实例
        return instance

可选优化

视图层的perform_update方法不需要手动返回Response,移除多余返回即可:

def perform_update(self, serializer):
    serializer.save(user=self.request.user)

你的get_queryset已经做了用户权限过滤,普通用户只能操作自己关联的数据,不存在越权修改他人数据的风险,无需额外做用户校验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:39:02