我遇到重复信号的问题。我查找了relevant part of Django docs和a similar question on Stackoverflow,但我仍然无法正常工作 - 即我计划的行动(在ActivityLog条目上创建)实际上发生了4次:/ < / p>
我添加了dispatch_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')
打印Patient APP is ready!
确实出现两次,尽管设置了dispatch_uid
,对象仍会创建4次。我误解了什么?
答案 0 :(得分:0)
@receiver(Signal,...)
装饰器是Signal.connect(...)
的快捷方式,因此您确实在导入create_new_patient
模块时两次注册@receiver
处理程序(signals
一次,第二次使用pre_save.connect()
。
解决方案:在App.ready()
方法中,您只需导入应用的signal.py
模块即可。这将触发使用@receiver
修饰的处理程序的注册。