Django保存后的信号调用了两次,即使uid无效

2024-10-01 09:40:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经使用@receiver修饰符在回调中注册了我的信号

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

我把from app.signals import *代码放在__init__.py中,我可以看到它被导入了两次,我认为没有一个好的方法来修复它,可能是由于settings.py中的installed apps造成的。我不明白为什么尽管使用了dispatch_uidmodelInstance.save只调用了一次,但它仍然运行do_callback两次。有什么建议吗?在


Tags: pyuid信号savedefcallback修饰符post
3条回答

我有同样的问题后保存和后删除信号。似乎session对象和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

I have put the from app.signals import * code in __init__.py

您不应该在__init__.py文件中放入任何内容。在

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

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

所以我将导入移到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__(...)和{}。在

结论

dispatch_uid确实有效,而且单次导入仍然是一种很好的做法。

相关问题 更多 >