Django中FileField存入数据库的文件为空,原因是什么?
问题原因及解决办法
核心原因
使用tempfile.TemporaryFile写入JSON后,文件指针停留在文件末尾,此时调用fp.read()会读取到空内容,因为没有从文件起始位置开始读取。
修复方案
方案1:重置文件指针位置
在fp.flush()之后、fp.read()之前,添加fp.seek(0)将指针移到文件开头:
fp.flush() fp.seek(0) # 关键:重置文件指针到起始位置 CollectionSnapshot.objects.create( final=False, created_by=request.user, collection_id=collection.id, file=ContentFile(fp.read(), name="assets.json") )
方案2:跳过临时文件,直接用字符串生成ContentFile
完全不需要临时文件,直接将序列化后的字典转为JSON字符串,再传入ContentFile,更简洁高效:
assets_json = json.dumps(assets) CollectionSnapshot.objects.create( final=False, created_by=request.user, collection_id=collection.id, file=ContentFile(assets_json, name="assets.json") )
额外排查建议
若仍怀疑json.dump静默失败,可添加异常捕获排查:
try: json.dump(assets, fp) except Exception as e: print(f"JSON序列化失败:{e}") # 此处可根据业务需求抛出异常或返回错误响应
内容的提问来源于stack exchange,提问作者Felipe de Abreu Prazeres
相关产品推荐
相关产品推荐

