[Fixed]-Possible to change order of Django signals?


I’m not positive, but I’d say it’s doubtful. Kinda more important is that the idea behind signals is that they should be atomic. A signal handler should respond the signal and shouldn’t care about other signals. Relying on the order of two unrelated signals (obviously you can rely on the order of pre_save and post_save for example) is not safe in general. So even though I don’t have a firm answer on your question, I’d offer the advice that yo should think carefully about the design.



No, you cannot change the order that signals are executed.

Signal priority has been proposed, but the core developers have said they will not implement this feature:



I know this is a very old question, but I was surprised by the lack of anything I found related to a workaround for handler ordering. So here is a subclass of the dispatcher which implements priorities.

from django.dispatch import Signal as BaseSignal
from django.dispatch.dispatcher import _make_id

class Signal(BaseSignal):

    def connect(self, receiver, sender=None, weak=True, dispatch_uid=None, priority=50):
        if dispatch_uid is None:
            dispatch_uid = _make_id(receiver)

        inner_uid = '{0}{1}'.format(priority, dispatch_uid)
        super(Signal, self).connect(receiver, sender=sender, weak=weak, dispatch_uid=inner_uid)

While this won’t help you with third-party apps, you can create your own signals with this class, and attach them to the built-in signals, allowing you to order the handlers within your own app.



Have you considered using one signal that calls create_social_profile and create_user_profile. perhaps you could attach this signal to post_save?

👤Al W

Leave a comment