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

