Как отправить сигнал 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
сигнал.