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

Django DRF调用PUT接口返回non_field_errors: No data provided报错如何解决

问题根本原因

报错No data provided是PUT视图逻辑和实际请求体结构不匹配导致,不是HTTP方法本身使用错误,具体问题出在两处:

  1. 视图的put方法中写了data = request.data.get('topic'),代码默认从请求体里取topic字段下的子对象作为更新数据,但你Postman发送的请求体是直接把title、text放在根层级,没有外层的topic包裹,所以data取到的是None,传给序列化器就判定为没有提交数据。
  2. 序列化器的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 12:54:04