使用File字段删除Django Model对象是否会删除用于该文件的存储?

时间:2010-08-25 22:45:08

标签: python django django-models

使用File字段删除Django Model对象是否会删除用于该文件的存储?它是否删除了磁盘上的文件?

2 个答案:

答案 0 :(得分:5)

OMG,我当然希望不是!谈谈你快速前往泪水之地。

如果要释放存储空间,则应覆盖模型的.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的管理员所做的那样。