Django通过唯一的调度ID发出重复信号

时间:2018-06-04 10:55:06

标签: python django django-models django-views

我遇到重复信号的问题。我查找了relevant part of Django docsa 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次。我误解了什么?

1 个答案:

答案 0 :(得分:0)

@receiver(Signal,...)装饰器是Signal.connect(...)的快捷方式,因此您确实在导入create_new_patient模块时两次注册@receiver处理程序(signals一次,第二次使用pre_save.connect()

解决方案:在App.ready()方法中,您只需导入应用的signal.py模块即可。这将触发使用@receiver修饰的处理程序的注册。