我正在制作一个我有FileField
的模型。我想将文件内容存储在数据库列中,而不是文件路径中。有什么建议吗?
答案 0 :(得分:22)
无视反对者。如果要完全控制内容,请将文件放在数据库中的blob字段中。我通常也会将文件名保存在一个单独的字段中,因此我可以根据需要重新构建文件(这样就可以保留扩展名,从而将其与大多数操作系统中的文件类型联系起来)。
确保将实际的blob数据存储在一个单独的表中,只通过id连接到你的文件名/额外信息表...这样你在处理与其他文件相关的任何信息时都不会牺牲任何性能而不是内容本身。
反对者未能意识到的是,数据库只是一种极其优化的文件系统形式。字节是字节,盘扇区是盘扇区。与组织系统相比,数据库在组织和搜索这些字节方面要好得多。更不用说,数据库实现了比大多数文件系统更严格的安全性,并且得到了更好的维护(备份,支持人员等)。
答案 1 :(得分:9)
我知道这是一个古老的问题,但从那时起就有一些很好的代码来允许这个选项。特别是,请参阅django-database-files,它将使用Django的存储API使所有FileFields和ImageFields将其内容存储在数据库中。还有一个fork来在文件系统上本地缓存文件,以克服使用数据库的最大警告,即延迟。
答案 2 :(得分:1)
那么,如何将其存储在二进制列中呢?然后,您可以存储字节集合。如果文件名对您来说也很重要,您可以将其存储在附加名称列中。
答案 3 :(得分:-2)
很容易
在admin
中覆盖保存方法filecontent=form.cleaned_data.get('upload_file')
data =filecontent.read()
from django.db import connection
cursor = connection.cursor()
cursor.execute("update filecontent set filecontent=(%s) where id=(%s)",[data,obj.id])
connection.connection.commit()
cursor.close()
connection.close()
这将把文件内容存储在表filecontent
的db列文件内容中