拆分Django与Django Channels为独立项目时如何共用数据库调用模型
异步Django项目复用原有模型的可行方案
共有两种落地成本较低的实现方式,可根据你的项目实际情况选择:
方案1:抽离公共模型包(推荐长期使用)
- 先把原有项目中需要跨项目共用的模型、常量、通用工具函数单独抽离为一个独立的Python包,比如命名为
project_common,包内保留原Django应用的结构,包含models.py、apps.py等文件 - 两个Django项目都引入该公共包:可选择将公共包放到内部依赖源后通过pip安装,或者直接用软链接的方式将公共包目录放到两个项目的根路径下
- 在两个项目的
settings.py的INSTALLED_APPS配置项中,统一注册公共包内的对应应用 - 两个项目的
DATABASES配置完全保持一致,表结构的迁移操作统一在HTTP项目中执行,异步项目不需要执行migrate相关命令 - 异步场景下调用ORM时,直接用Django原生异步ORM语法即可,比如
await User.objects.filter(id=1).afirst(),如果是复杂的同步ORM逻辑,可以用channels.db.database_sync_to_async包裹后调用
方案2:软链接原有模型目录(适合快速验证拆分)
- 直接将原项目中存放模型的所有应用目录,软链接到异步Django项目的根目录下
- 异步项目的
INSTALLED_APPS配置和HTTP项目保持完全一致,确保所有用到的模型对应的应用都被注册 - 两个项目的数据库配置完全相同,切记所有
makemigrations、migrate操作只能在HTTP项目中执行,避免两个项目生成冲突的迁移文件 - 该方案不用调整原有代码结构,适合短期快速拆分验证,长期维护还是建议用方案1抽离公共包
额外注意点:如果你的模型中用到了Django的信号、自定义管理器等逻辑,两种方案下都不需要做额外适配,只要保证相关逻辑在公共包/软链接目录中同步即可,Django会自动在两个项目中加载对应逻辑。
内容的提问来源于stack exchange,提问作者Abhinav verma
相关产品推荐
相关产品推荐

