Django两个项目共用PostgreSQL数据库如何跨项目导入已有模型
可行实现方案汇总
以下三种方案均可以满足需求,可根据你的实际场景选择:
方案1:将公共模型封装为独立可复用包(最推荐生产环境使用)
这是长期维护成本最低的方案,步骤如下:
- 把proj1中存放模型的Django app抽离为独立的Python包,基础结构参考:
django-shared-models/ ├── shared_models/ │ ├── __init__.py │ ├── models.py # 存放原proj1的所有公共模型 │ └── apps.py └── setup.py - 分别在proj1、proj2的虚拟环境中安装该独立包
- 两个项目的
INSTALLED_APPS配置项都添加shared_models,DATABASES配置指向同一个PostgreSQL实例即可 - 所有数据库迁移操作仅在proj1侧执行,proj2不需要执行迁移,避免迁移文件冲突
方案2:本地直接导入proj1的app代码(适合开发调试场景)
如果两个项目都运行在同一台机器上,可以不用打包直接导入:
- 在proj2的
settings.py头部添加代码,把proj1的根路径加入Python导包路径:import sys sys.path.insert(0, "/absolute/path/to/proj1") # 替换为proj1的实际根路径 - 在proj2的
INSTALLED_APPS中添加proj1存放模型的app,比如proj1.core_app - proj2的
DATABASES配置和proj1完全一致即可,同样仅在proj1侧执行迁移操作,不要在proj2运行makemigrations、migrate命令
方案3:proj2侧定义非托管映射模型(适合只读/临时使用场景)
如果proj2仅需要读取数据库数据,不需要修改表结构,可以直接在proj2内定义和proj1结构完全一致的模型,不需要依赖proj1代码:
from django.db import models # 字段定义和proj1中的对应模型完全一致 class Order(models.Model): order_no = models.CharField(max_length=32, unique=True) amount = models.IntegerField() create_time = models.DateTimeField(auto_now_add=True) class Meta: managed = False # 告知Django不管理该表的结构、迁移 db_table = "core_app_order" # 替换为proj1中该模型对应的实际数据库表名
- 该方案的缺陷是proj1修改模型字段后,需要手动同步修改proj2中的模型定义,否则会出现字段不匹配的问题
通用注意事项
- 两个项目的Django大版本尽量保持一致,避免ORM语法、字段属性定义不兼容
- 所有表结构变更、写入操作尽量统一在proj1侧执行,proj2如果需要写入数据优先调用proj1提供的接口,避免并发写入冲突
- 如果proj2不需要写数据,建议给proj2的数据库账号分配只读权限,降低误操作风险
内容的提问来源于stack exchange,提问作者Abhinav verma
相关产品推荐
相关产品推荐

