Python Django信号重复,具有唯一的调度id
我有重复信号的问题。我已经查找了,但仍然无法使其正常工作-即,我计划的操作(在ActivityLog条目上创建)实际发生了4次:/ 我添加了Python Django信号重复,具有唯一的调度id,python,django,django-models,django-views,Python,Django,Django Models,Django Views,我有重复信号的问题。我已经查找了,但仍然无法使其正常工作-即,我计划的操作(在ActivityLog条目上创建)实际发生了4次:/ 我添加了dispatch\u uid,问题仍然存在,所以我想我做错了什么。你能告诉我这个错误吗 这是我的密码: signals.py from patient.models import Patient from .models import ActivityLog @receiver(pre_save, sender=Patient) def create_ne
dispatch\u uid
,问题仍然存在,所以我想我做错了什么。你能告诉我这个错误吗
这是我的密码:
signals.py
from patient.models import Patient
from .models import ActivityLog
@receiver(pre_save, sender=Patient)
def create_new_patient(sender, instance, **kwargs):
ActivityLog.objects.create(
user=instance.created_by_user,
event='created a new patient',
patient_id=instance.patient_id
)
这是它在patient.apps
模块中的用法:
from django.apps import AppConfig
from django.db.models.signals import pre_save
app_name = "patient"
class PatientConfig(AppConfig):
name = 'patient'
verbose_name = "Patients"
def ready(self):
from activity_logger.signals import create_new_patient
print('Patient APP is ready!')
pre_save.connect(create_new_patient, sender='patient.Patient', dispatch_uid='patient')
打印患者应用程序已就绪尽管设置了dispatch\u uid
,但code>确实出现了两次,并且对象被创建了4次。我误解了什么 接收器(信号,…)
装饰器是信号的快捷方式。连接(…)
,因此您确实注册了两次创建新患者处理程序(导入信号
模块时一次通过@receiver
,第二次使用预保存连接()
)
解决方案:在你的App.ready()
方法中,你应该只导入你的应用程序的signal.py
模块。这将触发注册用@receiver
修饰的处理程序。嗨,@bruno desthuilliers回答得很好!事实上-这将创建的ActivityLogs对象的数量减少到…只有2个(以前的4个)。原因是ready()函数被触发了两次(例如,“Patient APP is ready”出现了两次)。知道原因吗?@user1544500没有,我想知道您实际上是如何做到这一点的。提示:在APP.ready
方法中添加调试器断点,并在第一次和第二次调用中检查调用堆栈。