在一个Django项目中与外部Django项目交互

5 投票
2 回答
2194 浏览
提问于 2025-04-17 05:32

我想找到一种方法,可以在一个独立的 Django 项目中与另一个 Django 项目的模型进行交互。我说的不是不同的应用,而是两个完全独立的项目,各自有自己的设置文件。

我正在把一个很老的网上商店(真的很老,都是静态 HTML)迁移到我们基于 Django 的后台。为此,我创建了一个独立的 Django 应用,专门处理所有的爬虫和解析工作,使用 Django 的 ORM(对象关系映射)和一些视图来帮助解析。现在我需要把爬虫项目中的数据填充到我们后台的目录数据中。我花了将近两天的时间想办法,但一直没有找到合适的方法。

我理想中的做法是把商店项目作为一个模块导入到 Django 命令类中,然后通过这种方式进行交互(要注意,它们是基于两个独立的设置文件,所以 setup_environ 是不行的)。我希望避免将爬虫数据序列化后再从商店导入,或者在 Django 的 ORM 之外与商店数据库进行交互,因为这个项目还远未完成,我希望保持尽可能的灵活性。

你有什么建议吗?我愿意尝试一些疯狂的想法,只要我能在一个脚本中与两个项目的 ORM 进行交互。

2 个回答

-1

为什么不把爬虫项目里的模型复制到你的新项目里(这样它们就在同一个项目空间里创建),然后直接用django的manage.py把旧爬虫项目的数据导出成json文件,再迁移到你的新项目呢?

只要你的爬虫项目的设置和数据库类型没有依赖关系,你应该可以把处理器、视图、网址等迁移到新项目里,然后把它们合并在一起,对吧?

如果你在新项目里保持外部模型的同步,就不需要额外的工作了,你可以使用像south这样的工具来迁移数据上下文。

这样你就可以简单地在新项目中导入旧模型,让它们直接互动。

否则,你就得考虑消息传递或网络通信,也就是进程间通信了。

5

我之前做过这个……

那么,

项目A,项目B

项目B想要调用项目A中的模型……

1) 如果项目B和项目A使用的是同一个数据库,并且用的是同一个用户/登录。

那你可以直接把项目A中的模型导入到项目B中,就像平常一样使用它们。

2) 如果项目B连接的是一个和项目A不同的数据库。

你可以在项目B的设置文件中定义两个数据库。

DATABASES = {
    'default': {
        'NAME': 'app_data',
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'USER': 'postgres_user',
        'PASSWORD': 's3krit'
    },
    'users': {
        'NAME': 'user_data',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysql_user',
        'PASSWORD': 'priv4te'
    }
}

然后你可以定义一个数据库路由器,这样Django就知道要去哪个数据库获取项目A的模型数据。

或者

你可以在使用ORM进行调用时,明确指定要使用的数据库,比如:

Author.objects.using('other').all()

撰写回答