我已经注册了我的信号使用的回调@receiver
装饰
@receiver(post_save, sender=User, dispatch_uid='ARandomUniqueString')
def do_callback(sender, **kwargs):
我已经把from app.signals import *
代码在__init__.py
,我可以看到,它已导入两次,我不认为这是解决它,因为有可能发生在一个很好的方式installed apps
在settings.py
。 我不明白为什么尽管使用dispatch_uid
和modelInstance.save
被调用一次,它仍然运行do_callback
两次。 有什么建议?
好让我感动的进口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
不工作,做单一的进口仍然是一个很好的做法。
我曾与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
我已经把from app.signals import *
代码__init__.py
你不应该把任何东西在您的__init__.py
文件。
如果您删除此__init__.py
,并将其添加到您的底部models.py
,它应该解决您的问题。
你也应该避免“盲目”的进口from foo import *
我只是遇到同样的问题。 我有一个接收器,做一些重要的事情必须一次为每个新创建在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文档 。 它没有工作,但我的代码上述作品粘贴。