0
0
Djangoframework~5 mins

pre_delete and post_delete signals in Django

Choose your learning style9 modes available
Introduction

These signals let you run code right before or after a database record is deleted. This helps you clean up or update related data automatically.

You want to delete related files from storage when a database record is deleted.
You need to update a log or audit trail whenever a record is removed.
You want to prevent deletion if certain conditions are not met.
You want to notify other parts of your app after a record is deleted.
You want to clean up related database entries automatically.
Syntax
Django
from django.db.models.signals import pre_delete, post_delete
from django.dispatch import receiver
from yourapp.models import YourModel

@receiver(pre_delete, sender=YourModel)
def before_delete(sender, instance, **kwargs):
    # code to run before deletion
    pass

@receiver(post_delete, sender=YourModel)
def after_delete(sender, instance, **kwargs):
    # code to run after deletion
    pass

Use @receiver decorator to connect your function to the signal.

The instance argument is the object being deleted.

Examples
This deletes the file from storage before the Document record is deleted.
Django
from django.db.models.signals import pre_delete
from django.dispatch import receiver
from myapp.models import Document

@receiver(pre_delete, sender=Document)
def delete_file(sender, instance, **kwargs):
    instance.file.delete(save=False)
This prints a message after a Comment is deleted.
Django
from django.db.models.signals import post_delete
from django.dispatch import receiver
from myapp.models import Comment

@receiver(post_delete, sender=Comment)
def log_deletion(sender, instance, **kwargs):
    print(f"Comment by {instance.author} was deleted.")
Sample Program

This example shows two signal handlers printing messages before and after a Note is deleted.

Django
from django.db import models
from django.db.models.signals import pre_delete, post_delete
from django.dispatch import receiver

class Note(models.Model):
    text = models.CharField(max_length=100)

@receiver(pre_delete, sender=Note)
def before_note_delete(sender, instance, **kwargs):
    print(f"About to delete Note: {instance.text}")

@receiver(post_delete, sender=Note)
def after_note_delete(sender, instance, **kwargs):
    print(f"Deleted Note: {instance.text}")

# Simulate deleting a Note instance
note = Note(text='Remember to buy milk')

# Normally, deletion happens via note.delete(), but here we simulate signals manually
before_note_delete(Note, note)
# Imagine the note is deleted here
after_note_delete(Note, note)
OutputSuccess
Important Notes

Signals run every time the model instance is deleted, even if deleted in bulk.

Be careful with side effects in signals to avoid unexpected bugs.

Summary

pre_delete runs before a record is deleted.

post_delete runs after a record is deleted.

Use these signals to manage related cleanup or notifications automatically.