0
0
Djangoframework~8 mins

pre_save and post_save signals in Django - Performance & Optimization

Choose your learning style9 modes available
Performance: pre_save and post_save signals
MEDIUM IMPACT
These signals affect server-side processing time before and after saving data, impacting backend response time and perceived page load speed.
Running extra logic when saving a model instance
Django
from django.db.models.signals import post_save
from django.dispatch import receiver
from threading import Thread

@receiver(post_save, sender=MyModel)
def async_post_save(sender, instance, **kwargs):
    def background_task():
        expensive_calculation(instance)
    Thread(target=background_task).start()
Moves heavy logic to a background thread after save, so save completes quickly without blocking response.
📈 Performance GainSave operation returns immediately, reducing backend latency and improving user experience
Running extra logic when saving a model instance
Django
from django.db.models.signals import pre_save
from django.dispatch import receiver

@receiver(pre_save, sender=MyModel)
def heavy_pre_save(sender, instance, **kwargs):
    import time
    time.sleep(2)  # Simulate slow processing
    instance.computed_field = expensive_calculation(instance)
The pre_save signal blocks the save operation for 2 seconds, delaying the database write and response time.
📉 Performance CostBlocks backend response for 2 seconds per save, increasing server latency
Performance Comparison
PatternServer ProcessingDatabase DelayResponse Time ImpactVerdict
Heavy pre_save blocking logicHigh CPU and waitDelayed until logic finishesBlocks response by seconds[X] Bad
Lightweight pre_save logicMinimal CPUMinimal delayFast response[OK] Good
Heavy post_save async logicRuns after save, non-blockingNo delay to saveFast response[OK] Good
Heavy post_save blocking logicHigh CPU after saveNo delay to saveBlocks response[!] OK but risky
Rendering Pipeline
pre_save and post_save signals run on the server before and after database writes. Slow handlers delay the server response, which delays browser receiving data and rendering updates.
Server Processing
Database Write
Response Time
⚠️ BottleneckServer Processing time during signal handler execution
Optimization Tips
1Avoid heavy or blocking logic in pre_save signals to keep saves fast.
2Use asynchronous processing for expensive tasks triggered by post_save signals.
3Monitor server response times to detect slow signal handlers affecting backend performance.
Performance Quiz - 3 Questions
Test your performance knowledge
What is the main performance risk of running heavy logic in a pre_save signal?
AIt causes layout shifts in the browser.
BIt increases client-side JavaScript execution time.
CIt blocks the database save and delays server response.
DIt reduces CSS selector performance.
DevTools: Network
How to check: Open DevTools, go to Network tab, reload page or trigger save, and check server response time in waterfall.
What to look for: Long server response times indicate slow backend processing, possibly due to blocking signal handlers.