Subjects

All subjects Django Java Python React Spring Boot JavaScript PHP
Sign Up Free
Question 7 of 10 · Django Models & ORM
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?