部署在不同Azure VM的两个Django项目如何跨项目导入model
导入跨Django项目Model的可行方案
以下方案按需选择即可:
方案1:抽离公共Model为独立包(长期维护首选)
如果只是复用Model的字段定义、不需要直接读写对方项目的真实数据,选这个方案最稳妥:
- 把两个项目共用的Model、相关常量、通用工具方法抽离成一个独立的Python包
- 两个项目分别用
pip install安装这个公共包,直接导入包里的Model使用即可 - 注意如果需要同步表结构,迁移文件也可以放到公共包中,两边项目执行
migrate时统一用公共包的迁移规则即可,避免两边表结构不一致
方案2:跨库直接访问Project1的真实数据
如果Project2需要读写Project1数据库里的实际数据,可按以下步骤操作:
- 先打通网络权限:在Azure网络安全组中开放Project1 VM的5432端口,允许Project2 VM的IP访问,同时修改Project1 Postgres的
pg_hba.conf配置,放行Project2的连接请求 - 在Project2的
settings.py中配置多数据库:
DATABASES = { 'default': { # Project2原有数据库配置 }, 'project1_db': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'Project1的数据库名', 'USER': 'Project1数据库用户名', 'PASSWORD': 'Project1数据库密码', 'HOST': 'Project1 VM的公网/内网IP', 'PORT': '5432', } }
- 把Project1的Model代码复制到Project2对应App下,给Model新增Meta配置:
class Project1SampleModel(models.Model): # 字段定义和Project1中完全一致 name = models.CharField(max_length=100) # 其余字段... class Meta: managed = False # 禁止Django对该表执行迁移操作,避免误改Project1的表 db_table = 'Project1中对应的实际表名' # Django默认表名规则为<App名>_<Model名>,需和实际表名完全匹配 app_label = 'Project2中存放该Model的App名称'
- 操作数据时手动指定数据库即可,示例:
project1_data = Project1SampleModel.objects.using('project1_db').filter(name="test").first()
方案3:自动生成Model代码(适合Model多不想手动复制的场景)
如果Project1的Model数量多,手动复制容易出错,只要两个数据库连通,在Project2环境下执行以下命令即可自动生成对应Model:python manage.py inspectdb --database=project1_db > project1_models.py
生成的代码默认自带managed = False配置,直接导入使用即可。
注意:如果两个项目的公共Model后续会频繁迭代,优先选方案1,避免两边Model定义不一致出现兼容性问题;如果只是临时需要读写对方项目的表,选方案2/3开发效率更高。
内容的提问来源于stack exchange,提问作者gjivanya
相关产品推荐
相关产品推荐

