Interview question
What are Django Signals and how do you use them? Django Signals क्या हैं और इन्हें कैसे use करते हैं?
Answer
Django Signals are a mechanism for decoupled apps to communicate when certain events occur (model save, delete, user login, etc.). They follow the Observer pattern without direct coupling between sender and receiver.
| Signal | Triggers On | Use Case |
|---|---|---|
| post_save | After model instance saved | Update cache, send emails |
| post_delete | After model instance deleted | Cleanup related data |
| pre_save | Before model instance saved | Validate/modify data |
| m2m_changed | Many-to-many relationship changed | Update counts |
from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver
from .models import Book
# Method 1: Using @receiver decorator
@receiver(post_save, sender=Book)
def send_email_on_book_created(sender, instance, created, **kwargs):
if created:
print(f"New book created: {instance.title}")
send_notification_email(instance)
@receiver(post_delete, sender=Book)
def log_book_deletion(sender, instance, **kwargs):
print(f"Book deleted: {instance.title}")
# Method 2: Manual signal connection
from django.db.models.signals import post_save
def update_book_cache(sender, instance, created, **kwargs):
if created:
cache.set(f"book_{instance.id}", instance, timeout=3600)
post_save.connect(update_book_cache, sender=Book)
# Method 3: In apps.py (Recommended)
from django.apps import AppConfig
from django.db.models.signals import post_save
class MyAppConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "myapp"
def ready(self):
# Signals imported here to avoid circular imports
from .signals import send_email_on_book_created
post_save.connect(send_email_on_book_created, sender=self.apps.get_model("myapp", "Book"))
# Best Practice: signals.py file
# myapp/signals.py
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Book
@receiver(post_save, sender=Book)
def update_related_data(sender, instance, created, **kwargs):
if created:
# Create related records
Category.objects.get_or_create(name=instance.category)
# myapp/apps.py
from django.apps import AppConfig
class MyAppConfig(AppConfig):
name = "myapp"
def ready(self):
import myapp.signals # Import signals when app is readyDjango Signals एक decoupled communication mechanism है। Observer pattern follow करता है।
| Signal | When Triggers | Use |
|---|---|---|
| post_save | Model save के बाद | Email भेजना |
| post_delete | Model delete के बाद | Cleanup data |
| pre_save | Model save से पहले | Data validate |
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Book
@receiver(post_save, sender=Book)
def send_email_on_book_created(sender, instance, created, **kwargs):
if created:
print(f"New book: {instance.title}")
send_notification_email(instance)Was this answer clear?