Сигналы Django дублируются с уникальным идентификатором отправки - PullRequest
0 голосов
/ 04 июня 2018

У меня проблема с дублирующимися сигналами.Я посмотрел на соответствующую часть Django docs и аналогичный вопрос о Stackoverflow , но я все еще не могу заставить его работать правильно - то есть, действие, которое я запланировал (создание назапись ActivityLog) на самом деле происходит 4 раза: /

Я добавил 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')

print Patient APP is ready! появляется дважды, а объект создается 4 раза, несмотря на установку dispatch_uid.Что я неправильно понял?

1 Ответ

0 голосов
/ 04 июня 2018

Декоратор @receiver(Signal,...) является ярлыком для Signal.connect(...), поэтому вы действительно регистрируете обработчик create_new_patient дважды (один раз через @receiver при импорте модуля signals, второй раз с pre_save.connect().

Решение: в вашем методе App.ready() вы должны просто импортировать модуль signal.py вашего приложения. Это инициирует регистрацию обработчиков, украшенных @receiver.

...