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

Django如何仅对MongoDB中指定应用执行migrate迁移操作

问题根源

你的数据库路由allow_migrate方法对不属于models_logging的应用返回了None,按照Django的路由规则:如果所有注册的路由对某条迁移操作都返回None,Django会默认允许该迁移执行,所以其他应用的表也会被同步到thor数据库。


修复步骤

  • 第一步:修改allow_migrate方法的默认返回逻辑
    非models_logging的应用如果要往thor数据库迁移时直接返回False,修改后的完整路由代码如下:
class AuthRouter(object):
    """
    控制models_logging应用所有数据库操作的路由
    """
    route_app_labels = {'models_logging'}

    def db_for_read(self, model, **hints):
        """
        读取models_logging应用的模型时走thor库
        """
        if model._meta.app_label == 'models_logging':
            return 'thor'
        return None

    def db_for_write(self, model, **hints):
        """
        写入models_logging应用的模型时走thor库
        """
        if model._meta.app_label == 'models_logging':
            return 'thor'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        """
        允许涉及models_logging应用模型的关联关系
        """
        if obj1._meta.app_label == 'models_logging' or \
           obj2._meta.app_label == 'models_logging':
           return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        """
        仅允许models_logging应用迁移到thor库,thor库禁止其他应用迁移
        """
        if app_label == 'models_logging':
            return db == 'thor'
        # 新增逻辑:非models_logging应用,禁止往thor库迁移
        if db == 'thor':
            return False
        return None
  • 第二步:确认项目配置正确
    检查settings.py中已经将该路由添加到DATABASE_ROUTERS配置项,示例如下:
# 替换为你路由类的实际导入路径
DATABASE_ROUTERS = ['myapp.routers.AuthRouter',]
  • 第三步:(可选)执行迁移时指定应用名
    要彻底避免误迁移其他应用,可以在执行迁移命令时直接指定应用名:
    python manage.py migrate models_logging --database=thor

内容的提问来源于stack exchange,提问作者Syed Muhammad Ibrahim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 06:24:05