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

