Performance: pre_delete and post_delete signals
These signals affect the server-side processing time before and after deleting database records, impacting backend response time and user experience.
Jump into concepts and practice - no test required
from django.db.models.signals import pre_delete from django.dispatch import receiver import threading @receiver(pre_delete, sender=MyModel) def async_cleanup(sender, instance, **kwargs): # Run cleanup asynchronously threading.Thread(target=lambda: instance.related_set.all().delete()).start()
from django.db.models.signals import pre_delete from django.dispatch import receiver import time @receiver(pre_delete, sender=MyModel) def heavy_cleanup(sender, instance, **kwargs): # Blocking long-running task time.sleep(5) # Simulate slow operation instance.related_set.all().delete()
| Pattern | Server Blocking | Database Load | User Wait Time | Verdict |
|---|---|---|---|---|
| Synchronous heavy work in pre_delete | High (blocks request) | High (multiple deletes) | High (slow response) | [X] Bad |
| Asynchronous cleanup in pre_delete | Low (non-blocking) | High (same deletes) | Low (fast response) | [OK] Good |
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.