Django DRF调用PUT接口返回non_field_errors: No data provided报错如何解决
问题根本原因
报错No data provided是PUT视图逻辑和实际请求体结构不匹配导致,不是HTTP方法本身使用错误,具体问题出在两处:
- 视图的
put方法中写了data = request.data.get('topic'),代码默认从请求体里取topic字段下的子对象作为更新数据,但你Postman发送的请求体是直接把title、text放在根层级,没有外层的topic包裹,所以data取到的是None,传给序列化器就判定为没有提交数据。 - 序列化器的
update方法存在字段不匹配隐患:你取validated_data.get('text')赋值给instance.description,如果Topic模型中对应的存储字段确实叫description,需要给序列化器的text字段加source映射,否则更新时会出现字段错误。
解决方法
方案1:修改PUT视图代码(推荐,和现有POST逻辑保持一致)
直接用整份请求体作为序列化器的输入数据即可:
def put(self, request, pk): saved_topic = get_object_or_404(Topic.objects.filter(id=pk)) # 去掉get('topic'),直接取整份请求数据 data = request.data serializer = TopicSerializer(instance=saved_topic, data=data, partial=True) if serializer.is_valid(raise_exception=True): topic_saved = serializer.save() return Response({ "success": "Topic '{}' updated successfully".format(topic_saved.title) })
方案2:修改Postman请求体结构(不修改代码的临时方案)
给现有请求体外面套一层topic字段:
{ "topic": { "title": "pipiska", "text": "pipiska111" } }
额外修复序列化器字段映射问题
如果Topic模型存储内容的字段确实叫description,修改序列化器的text字段配置:
text = serializers.CharField(max_length=500, source='description')
如果模型里的字段就叫text,修改update方法的赋值逻辑:
instance.text = validated_data.get('text', instance.text)
可选优化
建议路由条目末尾统一加斜杠,避免Django的APPEND_SLASH重定向问题:
path('topics/<int:pk>/', TopicView.as_view())
内容的提问来源于stack exchange,提问作者ASCII GLINAMES
相关产品推荐
相关产品推荐

