如何从其他信号发送django信号

时间:2017-11-30 15:04:31

标签: python django django-signals

TL; DR:
我需要一种在post_save信号后自动触发自定义信号的方法吗?

我目前正在为django开发一个库,需要很多来自django的post_save信号,我想知道是否有可能触发另一个信号 post_save后,我可以实现自己的,而不是干预post_save,以防使用该库的项目需要这样做。

到目前为止,我知道信号预计将接收一个类作为发送者参数,如果我手动触发来自post_save的信号,我将无所作为(我仍然在干预它)。这有什么解决方法吗?我在文档中遗漏了什么吗?

1 个答案:

答案 0 :(得分:7)

虽然这可以通过从另一个信号中手动调用信号来实现,如下所示:

post_save.send(MyModel, instance=a_mymodel_instance)

有更简单的方法可以做到这样的事情:

我们假设您遵循我在此答案中使用的文件组织:Django Create and Save Many instances of model when another object are created

建议1:

  • 让我们假设您的第一个post_saveMyModel1执行某些操作,而另一个post_save信号在触发第一个信号的实例上进行一些处理后会对MyModel2执行某些操作。
  • post_save始终以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获取保存之前MyModel1启动流程
  • 使用pre_savepost_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方法。