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.
Jump into concepts and practice - no test required
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.
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.
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)
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.")
This example shows two signal handlers printing messages before and after a Note is deleted.
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)
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.
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.
pre_delete and post_delete signals?pre_delete is triggered just before a model instance is deleted from the database.post_delete timingpost_delete is triggered immediately after the instance has been deleted.pre_delete runs before a record is deleted, post_delete runs after. -> Option Bpre_delete runs before a record is deleted, post_delete runs after. [OK]pre_delete signal to a model named Book?signal.connect(handler, sender=Model).pre_delete and Bookpre_delete.connect(my_handler, sender=Book) to connect the handler to the Book model.Book instance is deleted?
from django.db.models.signals import pre_delete, post_delete
from django.dispatch import receiver
@receiver(pre_delete, sender=Book)
def before_delete(sender, instance, **kwargs):
print(f"Deleting book: {instance.title} (pre_delete)")
@receiver(post_delete, sender=Book)
def after_delete(sender, instance, **kwargs):
print(f"Deleted book: {instance.title} (post_delete)")
book = Book(title='Django Basics')
book.delete()pre_delete runs before the instance is deleted, so its print runs first.post_delete runs after deletionpost_delete signal triggers, printing the second message.pre_delete signal?
from django.db.models.signals import pre_delete
@pre_delete(sender=Author)
def cleanup(sender, instance, **kwargs):
print('Cleaning up author data')@receiver(signal, sender=Model) decorator, not @pre_delete(sender=Model).@pre_delete(sender=Author) with @receiver(pre_delete, sender=Author) to fix the error.Comment objects related to a Post before the Post itself is deleted. Which signal and approach is best?pre_delete on Post allows deleting related comments before the post is removed.