【问题标题】:How to send a django signal from other signal如何从其他信号发送 django 信号
【发布时间】:2018-05-14 13:28:06
【问题描述】:

TL;DR:
我需要一种在post_save 信号之后自动触发自定义信号的方法,有什么方法可以做到吗?


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

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

【问题讨论】:

  • 为什么您需要自定义信号?如果每次保存某些内容时都会发生您需要做的事情,那么只需使用post_save 信号。是否使用传递给信号处理程序的所有参数都没有关系。
  • 嘿,@OscarCarballal 我想知道,你觉得我的回答有帮助吗?
  • 是的,对不起,我完全忘记了标记它。谢谢:)

标签: python django django-signals


【解决方案1】:

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

post_save.send(MyModel, instance=a_mymodel_instance)

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

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


建议一:

  • 让我们假设您的第一个 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 信号将在从mymodel1_signal 调用MyModel2.save() 后被触发。


建议 2:

  • 使用混合信号来实现正确的“时序”。
  • 让我们假设您希望在保存 MyModel1 之前在 MyModel2 上启动一个进程
  • 使用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:

MyModel1 post_save 信号中直接使用MyModel2 方法。

【讨论】:

  • 在操作很多实例时,我们可能会使用django频道触发一个离线任务来做。
  • @Hayden 我目前没有使用 django-channels 的经验。所以你说的似乎很有趣:)
猜你喜欢
  • 2016-03-21
  • 2014-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-10
  • 1970-01-01
  • 2020-08-17
相关资源
最近更新 更多