How do I override delete() on a model and have it still work with related deletes

Viewed 66174

I'm having a problem because I'm deleting a Widget by using some_widget_instance.delete(). I also have a model called WidgetFile with an override delete() method so that I can delete files off my hard drive when a WidgetFile is deleted. The problem I'm having is that if I delete a Widget, and it has WidgetFiles related to it like this:

class WidgetFile(models.Model):

    widget = models.ForeignKey(Widget)

Well, when I delete that Widget, it's WidgetFiles are deleted but the delete() method doesn't trigger and do my extra hard drive stuff. Any help is much appreciated.

9 Answers

I refactored this answer from the top answer above

import shutil
from django.db.models.signals import pre_delete 
from django.dispatch import receiver


"""WidgetFile is the model for the widget files.
pre_delete means delete run this function before the object is deleted from database"""
@receiver(pre_delete, sender=WidgetFile)
def delete_preo(sender, instance, **kwargs):
    shutil.rmtree(instance.repo)

Override model methods Django signals

Related