Python Django信号重复,具有唯一的调度id

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

我有重复信号的问题。我已经查找了,但仍然无法使其正常工作-即,我计划的操作(在ActivityLog条目上创建)实际发生了4次:/

我添加了
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
方法中添加调试器断点,并在第一次和第二次调用中检查调用堆栈。