Sort Django Signal's Receivers
Django calls receiver methods in its own way. Is there any way that we can sort the receivers of Django signal? I didn't find anything related to it in official Django documentatio
Solution 1:
Unless I'm mistaken, there isn't any reason to have more than one receiver for the same signal
and sender
. It is possible but I don't believe it is the right way to approach it and you will not have explicit control over the calling sequence of each.
If, for example, you have a set of duplicate signals (that do different things) like so:
from django.db.models import signals
from django.dispatch import receiver
from django.contrib.auth import get_user_model
User = get_user_model()
@receiver(signals.pre_save, sender=User)defsignal_receiver_1(*args, **kwargs):
pass@receiver(signals.pre_save, sender=User)defsignal_receiver_2(*args, **kwargs):
pass@receiver(signals.pre_save, sender=User)defsignal_receiver_3(*args, **kwargs):
pass
That would work but the order of execution isn't explicitly known. However, you could rewrite it to something like this to explicitly state the order of execution:
from django.db.models import signals
from django.dispatch import receiver
from django.contrib.auth import get_user_model
User = get_user_model()
defsignal_receiver_1(*args, **kwargs):
passdefsignal_receiver_2(*args, **kwargs):
passdefsignal_receiver_3(*args, **kwargs):
pass@receiver(signals.pre_save, sender=User):defpre_save_signal_receiver_master(*args, **kwargs):
signal_receiver_1(*args, **kwargs)
signal_receiver_2(*args, **kwargs)
signal_receiver_3(*args, **kwargs)
Solution 2:
https://docs.djangoproject.com/en/2.2/topics/signals/#listening-to-signals
"All of the signal’s receiver functions are called one at a time, in the order they were registered."
Try:
@receiver(signals.pre_save, sender=User)
def signal_receiver_1(*args, **kwargs):
print('RECEIVER 1')
@receiver(signals.pre_save, sender=User)
def signal_receiver_2(*args, **kwargs):
print('RECEIVER 2')
@receiver(signals.pre_save, sender=User)
def signal_receiver_3(*args, **kwargs):
print('RECEIVER 3')
Output will be:
RECEIVER 1
RECEIVER 2
RECEIVER 3
And then mix it up...
Post a Comment for "Sort Django Signal's Receivers"