Django 信号dispatch_uid

7 django django-signals

我有一个关于 for 信号的使用的问题dispatch_uid

目前,我通过简单地添加if not instance.order_reference. 我现在想知道是否dispatch_uid具有相同的功能,并且我可以删除if not子句。

信号.py

def reserveditem_create_order_reference(sender, instance, **kwargs):
    if not instance.order_reference:
        instance.order_reference = unique_order_reference_generator()
Run Code Online (Sandbox Code Playgroud)

应用程序.py

class OrdersConfig(AppConfig):
    name = 'orders'

    def ready(self):

        #Pre save signal for ReservedItem model
        reserved_model = self.get_model('ReservedItem')
        pre_save.connect(
            reserveditem_create_order_reference,
            sender=reserved_model,
            dispatch_uid="my_unique_identifier"
        )
Run Code Online (Sandbox Code Playgroud)

web*_*ter 4

正如文档所述,

在某些情况下,将接收器连接到信号的代码可能会运行多次。这可能会导致您的接收器函数被注册多次,从而为单个信号事件调用多次。如果此行为有问题(例如在保存模型时使用信号发送电子邮件时),请传递唯一标识符作为dispatch_uid参数来标识您的接收器函数

因此,是的,删除该if子句并设置唯一的信号接收器dispatch_uid将阻止您的处理程序多次连接(以及此后调用)。