TL; DR:
我需要一种在post_save
信号后自动触发自定义信号的方法吗?
我目前正在为django开发一个库,需要很多来自django的post_save
信号,我想知道是否有可能触发另一个信号在 post_save
后,我可以实现自己的,而不是干预post_save
,以防使用该库的项目需要这样做。
到目前为止,我知道信号预计将接收一个类作为发送者参数,如果我手动触发来自post_save的信号,我将无所作为(我仍然在干预它)。这有什么解决方法吗?我在文档中遗漏了什么吗?
答案 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_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...
这样mymodel2_signal
信号将在MyModel2.save()
调用mymodel1_signal
后触发。
建议2:
MyModel2
获取保存之前MyModel1
启动流程使用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
方法。