Как отправить сигнал django из другого сигнала
TL; DR:
Мне нужен способ вызвать пользовательский сигнал после post_save сигнал, автоматически, есть ли способ сделать это?
в настоящее время я разрабатываю библиотеку для django, которая требует много приходит и уходит с post_save сигнал в django, и мне было интересно, можно ли вызвать другой сигнал после на post_save чтобы я мог реализовать свой собственный и не вмешиваться post_save в случае проекта, использующего библиотеку нужно это сделать.
до сих пор я знаю, что сигналы должны получать класс в качестве аргумента отправителя, и если я запускаю вручную сигнал из post_save, я ничего не буду делать (я все равно буду вмешиваться). Есть ли обходной путь для этого? Я что-то пропустил в документации?
1 ответов
хотя это может быть возможно путем вызова сигнала вручную изнутри другого сигнала, как это:
post_save.send(MyModel, instance=a_mymodel_instance)
есть более простые способы сделать что-то вроде этого:
предположим, что вы следуете организации файла, которую я использую в этом ответе:Django создание и сохранение многих экземпляров модели при создании другого объекта
предложение 1:
- давайте предположим, что ваш первый
post_saveкак-тоMyModel1и еще одинpost_saveсигнал делает что-тоMyModel2после некоторой обработки на экземпляре, который вызвал первый сигнал. -
post_saveвсегда посылает на конец of asave()метод. -
Организуйте свои сигналы следующим образом:
@receiver(post_save, sender=MyModel1) def mymodel1_signal (sender, instance, **kwargs): Do stuff on MyModel1 instance... Do also stuff on MyModel2 and then call MyModel2.save() @receiver(post_save, sender=MyModel2) def mymodel2_signal (sender, instance, **kwargs): Do stuff on MyModel2 instance...сюда
mymodel2_signalсигнал будет срабатывать после вызоваMyModel2.save()отmymodel1_signal.
предложение 2:
- Используйте сочетание сигналов для достижения правильного "синхронизации".
- предположим, что вы хотите начать процесс на
MyModel2до получил -
использовать
pre_saveиpost_saveсигнала:@receiver(pre_save, sender=MyModel1) def mymodel1_signal (sender, instance, **kwargs): Do stuff on MyModel1 instance... Do also stuff on MyModel2 and then call MyModel2.save() @receiver(post_save, sender=MyModel2) def mymodel2_signal (sender, instance, **kwargs): Do stuff on MyModel2 instance...
предложение 3:
использовать MyModel2 способ непосредственно внутри MyModel1 post_save сигнал.