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

Osc*_*lal 8 python django django-signals

TL; DR:
我需要一种方法在信号发出后post_save自动触发自定义信号,有没有办法做到这一点?


我目前正在开发的Django库,需要自带了很多,并与云post_save在Django的信号,我想知道是否有可能触发另一信号之后post_save,所以我可以实现我自己的,而不是介入post_save的情况下,一个项目,使用库需要做到这一点.

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

Joh*_*fis 6

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

post_save.send(MyModel, instance=a_mymodel_instance)
Run Code Online (Sandbox Code Playgroud)

有更简单的方法来做这样的事情:

让我们假设您遵循我在此答案中使用的文件组织:Django创建并保存创建另一个对象时的许多模型实例


建议1:

  • 让我们假设你的第一个post_save做了什么,MyModel1而另一个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...
    
    Run Code Online (Sandbox Code Playgroud)

    这样mymodel2_signal,在调用MyModel2.save()from 之后将触发信号mymodel1_signal.


建议2:

  • 使用混合信号来实现正确的"时序".
  • 让我们假设你想MyModel2MyModel1获得get 之前开始一个进程
  • 使用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...
    
    Run Code Online (Sandbox Code Playgroud)

建议3:

MyModel2直接在MyModel1 post_save信号内使用方法.