对 django 信号的接收器进行排序



Django以自己的方式调用接收器方法。有什么方法可以对 Django 信号的接收器进行排序吗?我在官方 Django 文档中没有找到任何与之相关的内容。

https://docs.djangoproject.com/en/2.2/topics/signals/#listening-to-signals

"所有信号的接收器功能都按照注册顺序一次调用一个。

尝试:

@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')

输出将是:

RECEIVER 1
RECEIVER 2
RECEIVER 3

然后混合起来...

除非我弄错了,否则没有任何理由为同一signalsender使用多个接收器。这是可能的,但我不相信这是处理它的正确方法,您将无法明确控制每个调用序列。

例如,如果你有一组重复的信号(做不同的事情(,如下所示:

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)
def signal_receiver_1(*args, **kwargs):
pass
@receiver(signals.pre_save, sender=User)
def signal_receiver_2(*args, **kwargs):
pass
@receiver(signals.pre_save, sender=User)
def signal_receiver_3(*args, **kwargs):
pass

这将起作用,但执行顺序没有明确知道。但是,您可以将其重写为如下所示的内容,以明确说明执行顺序:

from django.db.models import signals
from django.dispatch import receiver
from django.contrib.auth import get_user_model

User = get_user_model()

def signal_receiver_1(*args, **kwargs):
pass
def signal_receiver_2(*args, **kwargs):
pass
def signal_receiver_3(*args, **kwargs):
pass
@receiver(signals.pre_save, sender=User):
def pre_save_signal_receiver_master(*args, **kwargs):
signal_receiver_1(*args, **kwargs)
signal_receiver_2(*args, **kwargs)
signal_receiver_3(*args, **kwargs)

最新更新