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

DRF保存文件时报'dict' object has no attribute '_committed'错误如何解决

报错根因

Django模型FileField类型的字段在保存时会校验传入对象是否为文件实例,_committed是文件实例的内置属性,你当前直接传入前端提交的字典对象,所以触发属性不存在报错。
另外你代码中注释了MultiPartParser解析器,DRF默认的JSON解析器无法识别上传的二进制文件,你拿到的attachement字段只是前端构造的元信息字典,没有真实文件内容,且blob类型的链接仅在前端本地环境有效,后端无法直接访问。

解决方案

分两种场景适配:

场景1:仅需要保存文件路径到数据库(文件已由前端上传到云存储/其他服务,后端只存访问链接)

  • 第一步:修改AnswerAttachments模型的attachement字段类型为URLField或CharField,不需要用FileField
  • 第二步:修改保存逻辑,取字典中的url字段赋值即可,单文件代码修改示例:
AnswerAttachments.objects.create(
    answer = instance,
    attachement = attachements[0]['url']
)

多文件同理,循环中改为attachement = attachement['url']即可。

场景2:需要后端接收文件并存储到服务器/对象存储

  • 第一步:放开代码中的解析器配置:
parser_classes = (MultiPartParser, FormParser)
  • 第二步:调整前端上传逻辑,使用multipart/form-data格式提交请求,将文件二进制内容作为单独字段传递,不要封装成JSON字典。
  • 第三步:后端从request.FILES中获取真实的文件实例再保存,示例:
# 前端多文件依次挂载到attachement_0、attachement_1...字段
for i in range(len(attachements)):
    file_obj = request.FILES.get(f'attachement_{i}')
    AnswerAttachments.objects.create(
        answer=instance,
        attachement=file_obj
    )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:57:01