Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does deleting a Django Model object with a File field delete the storage used for the file?

Does deleting a Django Model object with a File field delete the storage used for the file? Does it delete the file on disk?

like image 216
MikeN Avatar asked Jan 21 '23 13:01

MikeN


2 Answers

OMG, I sure hope not! Talk about your quick trip to the land of tears.

If you want the storage freed up then you should override the model's .delete() method, delete the file, and then super() to let the DB finish its clean up.

Update: I was wrong ... maybe. From looking at the code in django/db/fields/files.py (ver 1.1.1) I can see that under certain circumstances, depending on which storage object class you are using, it may (or may not) delete the associated storage. Unfortunately, when and why is inconsistent and there is a 2+ year old ticket open on this ambiguity. The default_storage class does delete the associated file, but not reliably (see above mentioned ticket).

This means you need to be careful and to test the specific storage class you are using before you have important data end up in an indeterminate state.

like image 110
Peter Rowell Avatar answered Jan 25 '23 15:01

Peter Rowell


As of Django 1.3, no. From the Django 1.3 CHANGELOG:

In earlier Django versions, when a model instance containing a FileField was deleted, FileField took it upon itself to also delete the file from the backend storage. This opened the door to several data-loss scenarios, including rolled-back transactions and fields on different models referencing the same file. In Django 1.3, when a model is deleted the FileField's delete() method won't be called. If you need cleanup of orphaned files, you'll need to handle it yourself (for instance, with a custom management command that can be run manually or scheduled to run periodically via e.g. cron).

Subsequent versions (I verified for 1.5) have continued the policy of leaving it as an exercise for the developer to decide when and how to delete model-associated files from storage.

A simple way to handle file deletion, if it meets your file lifetime requirements, is to catch the pre_delete signal and delete the file then. This method is compatible with bulk deletion, as is done by Django's admin.

like image 26
darrinm Avatar answered Jan 25 '23 16:01

darrinm