You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中仅将指定models.py的模型迁移至第二个数据库?

Django实现单models.py对应额外数据库的迁移方案

要实现指定models.py文件的模型仅迁移到第二个数据库,核心是通过数据库路由控制模型与数据库的绑定关系,以下是具体步骤:

1. 编写数据库路由类

在项目根目录新建db_routers.py文件,编写路由类来区分不同models文件的模型归属:

class ExtraDBRouter:
    # 定义额外models文件的模块路径
    EXTRA_MODELS_MODULE = "myapp.extra_models"  # 替换为你的extra_models.py所在路径

    def db_for_read(self, model, **hints):
        # 读取操作:extra_models中的模型用第二个数据库
        if model.__module__ == self.EXTRA_MODELS_MODULE:
            return "second_db"
        return "default"

    def db_for_write(self, model, **hints):
        # 写入操作:extra_models中的模型用第二个数据库
        if model.__module__ == self.EXTRA_MODELS_MODULE:
            return "second_db"
        return "default"

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        # 迁移控制:严格限制模型可迁移的数据库
        from myapp import extra_models
        import inspect
        
        # 获取extra_models中的所有模型名称
        extra_model_names = [
            obj.__name__ for name, obj in inspect.getmembers(extra_models) 
            if inspect.isclass(obj) and hasattr(obj, "_meta")
        ]

        if db == "second_db":
            # 仅允许extra_models中的模型迁移到second_db
            return model_name in extra_model_names
        elif db == "default":
            # 禁止extra_models中的模型迁移到default
            return model_name not in extra_model_names
        return False

2. 配置项目settings.py

(1)确认数据库配置已存在两个库

确保DATABASES中已配置default和second_db:

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.sqlite3",  # 替换为你的数据库引擎
        "NAME": BASE_DIR / "db.sqlite3",
    },
    "second_db": {
        "ENGINE": "django.db.backends.sqlite3",
        "NAME": BASE_DIR / "second_db.sqlite3",
    }
}

(2)注册数据库路由

添加DATABASE_ROUTERS配置,指向刚才编写的路由类:

DATABASE_ROUTERS = ["myproject.db_routers.ExtraDBRouter"]  # 替换为你的项目路径

3. 让Django识别额外的models文件

在包含extra_models.py的app目录下,修改__init__.py文件,导入额外模型:

from .extra_models import *

4. 执行迁移操作

(1)生成所有模型的迁移文件

python manage.py makemigrations

(2)迁移主数据库(default)

默认会仅迁移归属default的模型:

python manage.py migrate

(3)迁移第二个数据库(second_db)

路由会自动过滤仅归属second_db的模型进行迁移:

python manage.py migrate --database=second_db

内容的提问来源于stack exchange,提问作者Тв0р0бушек

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 17:25:58