使用File字段删除Django Model对象是否会删除用于该文件的存储?它是否删除了磁盘上的文件?
答案 0 :(得分:5)
如果要释放存储空间,则应覆盖模型的.delete()方法,删除文件,然后使用super()让数据库完成清理。
更新:我错了......也许吧。通过查看django / db / fields / files.py(ver 1.1.1)中的代码,我可以看到在某些情况下,根据您使用的storage object class,它可能(或可能不)删除相关存储。不幸的是,何时以及为何不一致,并且在这种模糊性方面存在2+ year old ticket。 default_storage类 删除关联文件,但不可靠(参见上面提到的票证)。
这意味着您需要小心并在之前测试特定存储类,以使重要数据最终处于不确定状态。
答案 1 :(得分:4)
自Django 1.3起,否。来自Django 1.3 CHANGELOG:
在早期的Django版本中,当删除包含FileField的模型实例时,FileField会自行删除后端存储中的文件。这为几个数据丢失场景打开了大门,包括回滚事务和引用同一文件的不同模型上的字段。在Django 1.3中,当删除模型时,不会调用FileField的delete()方法。如果您需要清除孤立文件,您需要自己处理它(例如,使用可以手动运行或计划通过例如cron定期运行的自定义管理命令)。
后续版本(我验证为1.5)继续保留将其作为练习的政策,以便开发人员决定何时以及如何从存储中删除与模型相关的文件。
如果文件删除符合您的文件生存期要求,则处理文件删除的一种简单方法是catch the pre_delete signal and delete the file。这种方法与批量删除兼容,正如Django的管理员所做的那样。