尽管uid,Django发布保存信号被调用两次

Pra*_*kar 8 python mysql django signals

我使用@receiver装饰器使用回调注册了我的信号

@receiver(post_save, sender=User, dispatch_uid='ARandomUniqueString') 
def do_callback(sender, **kwargs):
Run Code Online (Sandbox Code Playgroud)

我已经把from app.signals import *代码放进去__init__.py,我可以看到它被导入了两次,我认为没有一种好方法可以解决它,可能是由于installed appsin 而发生的settings.py.我无法理解为什么尽管使用dispatch_uidmodelInstance.save仅被调用一次,它仍然运行do_callback两次.有什么建议?

Pra*_*kar 10

好的,所以我将导入移动到views.py(或者models.py当它只导入一次时,它被调用了两次.

问题是post_save当对象被创建和保存时,信号被调用.我不知道为什么这样我添加了现在有效的解决方法

created = False

    #Workaround to signal being emitted twice on create and save
    if 'created' in kwargs:
        if kwargs['created']:
            created=True

    #If signal is from object creation, return
    if created:
        return
Run Code Online (Sandbox Code Playgroud)

编辑:

post_save因为我使用了.create(...)相当于__init__(...)和的两次被调用.save().

结论

dispatch_uid 确实有效,做单一进口仍然是一种很好的做法.