Subjects

All subjects Django Java Python React Spring Boot JavaScript PHP
Sign Up Free
Question 1 of 10 · Django Signals & Decorators
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.

SignalTriggers OnUse Case
post_saveAfter model instance savedUpdate cache, send emails
post_deleteAfter model instance deletedCleanup related data
pre_saveBefore model instance savedValidate/modify data
m2m_changedMany-to-many relationship changedUpdate 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 ready

Django Signals एक decoupled communication mechanism है। Observer pattern follow करता है।

SignalWhen TriggersUse
post_saveModel save के बादEmail भेजना
post_deleteModel delete के बादCleanup data
pre_saveModel 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?