如何从其他信号发送django信号
How to send a django signal from other signal
TL;DR:
我需要一种在 post_save
信号之后自动触发自定义信号的方法,有什么方法可以做到吗?
我目前正在为 django 开发一个库,它需要在 django 中使用 post_save
信号来来去去,我想知道是否有可能在 [] 之后触发另一个信号 post_save
这样我就可以自己实现而不是干预 post_save
以防使用该库的项目需要这样做。
到目前为止,我知道信号应该接收 class 作为发送方参数,如果我手动触发来自 post_save 的信号,我将什么都不做(我仍然干预它)。有什么解决方法吗?我在文档中遗漏了什么吗?
虽然这可以通过从另一个信号内部手动调用一个信号来实现,如下所示:
post_save.send(MyModel, instance=a_mymodel_instance)
有更简单的方法可以做到这一点:
让我们假设您遵循我在此答案中使用的文件组织:
建议1:
- 让我们假设您的第一个
post_save
对 MyModel1
做了一些事情,而另一个 post_save
信号在对触发第一个的实例进行了一些处理之后对 MyModel2
做了一些事情信号。
post_save
总是在 save()
方法的 end 发送。
按如下方式组织信号:
@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()
后触发。
建议二:
- 使用混合信号来实现正确的 "timing"。
- 让我们假设您想在
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...
建议三:
直接在 MyModel1
post_save
信号中使用 MyModel2
方法。
TL;DR:
我需要一种在 post_save
信号之后自动触发自定义信号的方法,有什么方法可以做到吗?
我目前正在为 django 开发一个库,它需要在 django 中使用 post_save
信号来来去去,我想知道是否有可能在 [] 之后触发另一个信号 post_save
这样我就可以自己实现而不是干预 post_save
以防使用该库的项目需要这样做。
到目前为止,我知道信号应该接收 class 作为发送方参数,如果我手动触发来自 post_save 的信号,我将什么都不做(我仍然干预它)。有什么解决方法吗?我在文档中遗漏了什么吗?
虽然这可以通过从另一个信号内部手动调用一个信号来实现,如下所示:
post_save.send(MyModel, instance=a_mymodel_instance)
有更简单的方法可以做到这一点:
让我们假设您遵循我在此答案中使用的文件组织:
建议1:
- 让我们假设您的第一个
post_save
对MyModel1
做了一些事情,而另一个post_save
信号在对触发第一个的实例进行了一些处理之后对MyModel2
做了一些事情信号。 post_save
总是在save()
方法的 end 发送。按如下方式组织信号:
@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()
后触发。
建议二:
- 使用混合信号来实现正确的 "timing"。
- 让我们假设您想在
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...
建议三:
直接在 MyModel1
post_save
信号中使用 MyModel2
方法。