某个远程数据库上的Django Post Signal

时间:2019-07-13 16:46:35

标签: django

我有两个不同的项目

Project1设置

默认-项目1数据库

db2-项目2数据库

project2设置

默认-项目2数据库

我在项目1中使用序列化程序,项目2的模型等的操作。 我将完整的应用程序从项目2复制到项目1,并在settings.py中注册了该模型,还删除了migrations文件夹,因此,无论何时我在项目1 shell中进行迁移,它都不会为项目2应用程序(项目1和因此,迁移不会在项目1中添加项目2的任何模型。

现在我面临的问题是我必须在项目1中导入的项目2应用的模型上使用post_save信号,并在project1中得到通知

@receiver(post_save, sender=Project2Model)
def project2model_save_hook(sender, instance, created, **kwargs):
    print(created)

仅当项目2中存在此信号但项目1中不存在此信号时,此功能才起作用。在项目1中,当在项目2的默认db或项目1的db2中创建对象时,将永远不会调用该信号

我应该如何进行?

1 个答案:

答案 0 :(得分:3)

信号是特定于Django的,仅在同一过程中触发。如果要在不同项目之间触发功能/工作负载,则需要开始使用某种事件驱动的体系结构。

最基本的解决方案是使用消息队列,例如rabbitmqkafka甚至redis (pub/sub)。这是您的情况的一个非常简单的示例:

  • 您创建一个名为model1_instance_created的Rabbitmq队列
  • 您在project2上消费了model1_instance_created的消息
  • 只要在项目1上调用此模型的model1_instance_created,您就会向post_save发布新消息。

但是,您还需要考虑其他事项。是否使project1和project2共享相同的数据库(希望不是)。如果没有,他们如何同步数据?数据一致性呢?然后是网络延迟以及与微服务有关的所有其他问题。