post_save नामक Signal
In this page:
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save, sender=ModelName)
def handler_name(sender, instance, created, **kwargs):
if created:
# run only on first insert
post_save को क्या Trigger करता है?
post_save save() database में लिखना खत्म करने के ठीक बाद fire होता है। Django इसे sender (model class), instance (saved object), और created (एक नई row के लिए True) pass करता है।
उदाहरण: What Triggers post_save?
post_save fires right after save() finishes writing to the database. Django passes it sender (the model class), instance (the saved object), and created (True for a new row).
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Profile
@receiver(post_save, sender=Profile)
def profile_saved(sender, instance, created, **kwargs):
print(f"Profile {instance.pk} saved, created={created}")
{# Django-only code -- models.py/views.py/urls.py/settings.py
snippets, or template markup using Django template tags/variables
-- can't run standalone via Judge0 or the browser preview, since
it needs a real Django project. Only this course's pure-Python
examples (example_lang == 'python', no Django imports) are
actually runnable, so those still get the button below. #}
created Flag उपयोग करना
एक बहुत common pattern यह है कि setup logic सिर्फ पहली बार एक row insert होने पर चलाएं, जैसे हर बार एक नया User बनने पर एक related Profile auto-create करना।
उदाहरण: Using the created Flag
A very common pattern is to run setup logic only the first time a row is inserted, such as auto-creating a related Profile whenever a new User is created.
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User
from .models import Profile
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
{# Django-only code -- models.py/views.py/urls.py/settings.py
snippets, or template markup using Django template tags/variables
-- can't run standalone via Judge0 or the browser preview, since
it needs a real Django project. Only this course's pure-Python
examples (example_lang == 'python', no Django imports) are
actually runnable, so those still get the button below. #}
Infinite Save Loops से बचना
एक post_save receiver के अंदर उसी model के लिए instance.save() फिर से call करना post_save को फिर से trigger करता है, जो हमेशा के लिए loop हो सकता है। इसके बजाय QuerySet.update() उपयोग करें, क्योंकि यह signal फिर से fire नहीं करता।
उदाहरण: Avoiding Infinite Save Loops
Calling instance.save() again inside a post_save receiver for the same model re-triggers post_save, which can loop forever. Use QuerySet.update() instead, since it doesn't re-fire the signal.
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Article
@receiver(post_save, sender=Article)
def set_slug(sender, instance, created, **kwargs):
if created and not instance.slug:
Article.objects.filter(pk=instance.pk).update(slug=f"article-{instance.pk}")
{# Django-only code -- models.py/views.py/urls.py/settings.py
snippets, or template markup using Django template tags/variables
-- can't run standalone via Judge0 or the browser preview, since
it needs a real Django project. Only this course's pure-Python
examples (example_lang == 'python', no Django imports) are
actually runnable, so those still get the button below. #}
sender के साथ Scoping करना
Connect करते समय sender= pass करना एक receiver को एक model तक सीमित करता है। वही receiver function कई senders से connected हो सकता है अगर आपको shared behavior चाहिए।
उदाहरण: Scoping with sender
Passing sender= when connecting limits a receiver to one model. The same receiver function can be connected to multiple senders if you want shared behavior.
from django.db.models.signals import post_save
from .models import Article, Profile
def log_change(sender, instance, **kwargs):
print(f"{sender.__name__} #{instance.pk} changed")
post_save.connect(log_change, sender=Article)
post_save.connect(log_change, sender=Profile)
{# Django-only code -- models.py/views.py/urls.py/settings.py
snippets, or template markup using Django template tags/variables
-- can't run standalone via Judge0 or the browser preview, since
it needs a real Django project. Only this course's pure-Python
examples (example_lang == 'python', no Django imports) are
actually runnable, so those still get the button below. #}
- created flag जांचना भूल जाना और हर update पर भी 'new object' logic चलाना।
- उसी model पर उसके post_save receiver के अंदर बिना guard instance.save() फिर से call करके infinite loops cause करना।
- एक receiver connect करना लेकिन इसे शामिल करने वाला module कभी import न करना, इसलिए यह चुपचाप कभी नहीं चलता।
- post_save एक model instance के save() method पूरा होने के तुरंत बाद fire होता है।
- created boolean आपको बताता है कि यह एक INSERT था या एक UPDATE।
- एक receiver को एक specific model तक scope करने के लिए sender=Model उपयोग करें।
- Recursion रोकने के लिए उसी instance को इसके अपने post_save receiver के अंदर फिर से save करने से बचें।
Chapter Quiz — Complete all 8 topics to unlock
0/8 topics done
Complete these topics first: