在一个Django项目中与外部Django项目交互
我想找到一种方法,可以在一个独立的 Django 项目中与另一个 Django 项目的模型进行交互。我说的不是不同的应用,而是两个完全独立的项目,各自有自己的设置文件。
我正在把一个很老的网上商店(真的很老,都是静态 HTML)迁移到我们基于 Django 的后台。为此,我创建了一个独立的 Django 应用,专门处理所有的爬虫和解析工作,使用 Django 的 ORM(对象关系映射)和一些视图来帮助解析。现在我需要把爬虫项目中的数据填充到我们后台的目录数据中。我花了将近两天的时间想办法,但一直没有找到合适的方法。
我理想中的做法是把商店项目作为一个模块导入到 Django 命令类中,然后通过这种方式进行交互(要注意,它们是基于两个独立的设置文件,所以 setup_environ 是不行的)。我希望避免将爬虫数据序列化后再从商店导入,或者在 Django 的 ORM 之外与商店数据库进行交互,因为这个项目还远未完成,我希望保持尽可能的灵活性。
你有什么建议吗?我愿意尝试一些疯狂的想法,只要我能在一个脚本中与两个项目的 ORM 进行交互。
2 个回答
为什么不把爬虫项目里的模型复制到你的新项目里(这样它们就在同一个项目空间里创建),然后直接用django的manage.py把旧爬虫项目的数据导出成json文件,再迁移到你的新项目呢?
只要你的爬虫项目的设置和数据库类型没有依赖关系,你应该可以把处理器、视图、网址等迁移到新项目里,然后把它们合并在一起,对吧?
如果你在新项目里保持外部模型的同步,就不需要额外的工作了,你可以使用像south这样的工具来迁移数据上下文。
这样你就可以简单地在新项目中导入旧模型,让它们直接互动。
否则,你就得考虑消息传递或网络通信,也就是进程间通信了。
我之前做过这个……
那么,
项目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()