Interview question
What are Django signals and when should you use them? Django signals क्या हैं और इन्हें कब use करना चाहिए?
Answer
Signals let certain senders notify a set of receivers when specific actions occur (like a model being saved or deleted), enabling decoupled code that reacts to events without direct coupling.
from django.db.models.signals import post_save, pre_delete
from django.dispatch import receiver
from django.contrib.auth.models import User
from myapp.models import Profile
# post_save - runs AFTER a model instance is saved
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created: # only run when a NEW user is created, not on every update
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
# Now Profile is automatically created whenever a User is created
user = User.objects.create(username='john') # triggers create_user_profile automatically
# pre_delete - runs BEFORE a model instance is deleted
@receiver(pre_delete, sender=Profile)
def log_profile_deletion(sender, instance, **kwargs):
print(f'About to delete profile for {instance.user.username}')
# Common signals: pre_save, post_save, pre_delete, post_delete,
# m2m_changed, request_started, request_finished
# IMPORTANT: signals must be imported somewhere Django loads, typically
# in the app's apps.py ready() method, or signals silently won't connect
# apps.py
from django.apps import AppConfig
class MyAppConfig(AppConfig):
name = 'myapp'
def ready(self):
import myapp.signals # ensures signal handlers get registered
# When to AVOID signals: they can make code flow hard to trace -
# for simple cases, overriding save() directly is often clearer
class Profile(models.Model):
def save(self, *args, **kwargs):
# custom logic here instead of a signal
super().save(*args, **kwargs)Signals कुछ senders को specific actions (जैसे model save/delete होना) होने पर receivers को notify करने देते हैं, decoupled code enable करते हैं जो events पर react करे।
from django.db.models.signals import post_save, pre_delete
from django.dispatch import receiver
from django.contrib.auth.models import User
from myapp.models import Profile
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created: # सिर्फ नया user बनने पर
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
user = User.objects.create(username='john') # automatically trigger होता है
@receiver(pre_delete, sender=Profile)
def log_profile_deletion(sender, instance, **kwargs):
print(f'{instance.user.username} की profile delete होने वाली है')
# ज़रूरी: signals को app के ready() में import करना चाहिए
# apps.py
from django.apps import AppConfig
class MyAppConfig(AppConfig):
name = 'myapp'
def ready(self):
import myapp.signals
# Signals कब AVOID करें: code flow trace करना मुश्किल हो सकता है -
# simple cases के लिए save() override करना ज़्यादा साफ़ है
class Profile(models.Model):
def save(self, *args, **kwargs):
super().save(*args, **kwargs)Was this answer clear?