尽管UID的Django后保存信号获取调用两次(Django post save signal ge

2019-06-27 03:09发布

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

@receiver(post_save, sender=User, dispatch_uid='ARandomUniqueString') 
def do_callback(sender, **kwargs):

我已经把from app.signals import *代码在__init__.py ,我可以看到,它已导入两次,我不认为这是解决它,因为有可能发生在一个很好的方式installed appssettings.py 。 我不明白为什么尽管使用dispatch_uidmodelInstance.save被调用一次,它仍然运行do_callback两次。 有什么建议?

Answer 1:

好让我感动的进口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

编辑:

post_save是越来越调用两次,因为我用.create(...)这相当于__init__(...).save()

结论

dispatch_uid不工作,做单一的进口仍然是一个很好的做法。



Answer 2:

我曾与post_save也post_delete信号同样的问题。 看来,会话对象和LogEntry对象都被保存以及尽管设置dispatch_uid创建多个信号。

什么工作对我来说是:

from django.contrib.admin.models import LogEntry
from django.contrib.sessions.models import Session

....

if sender in [LogEntry, Session]:
    return 
else:
    # do your thing here


Answer 3:

我已经把from app.signals import *代码__init__.py

你不应该把任何东西在您的__init__.py文件。

如果您删除此__init__.py ,并将其添加到您的底部models.py ,它应该解决您的问题。

你也应该避免“盲目”的进口from foo import *



Answer 4:

我只是遇到同样的问题。 我有一个接收器,做一些重要的事情必须一次为每个新创建在Django模型实例来完成。 所以,我用post_save信号,但当时正在为创建该我做的每一样新的模型实例调用两次Profile.objects.create(...) 这个问题的解决方案是created附带标志kwargs 。 这里是你如何使用这些标志,以确保您打算采取行动,只有一次:

@receiver(post_save, sender=Profile)
def publish_auction(sender, **kwargs):
    if kwargs['created']:
        kwargs['instance'].send_email_confirmation()

我试过dispatch_uid从建议Django文档 。 它没有工作,但我的代码上述作品粘贴。



文章来源: Django post save signal getting called twice despite uid