Как отправить сигнал 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 a save() метод.
  • Организуйте свои сигналы следующим образом:

    @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 сигнал.