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

在已承载old_django的AppsDB中新建new_django避免覆盖系统表的方案咨询

解决方案

方案1:自定义Django系统表前缀(最优雅原生方案)

核心思路是让new_django的所有系统表(auth_*、django_*)使用独立表名(比如加new_前缀),和old_django的表完全隔离,无需改动架构或用户。

具体步骤:

  • 自定义用户模型
    在new_django的某个应用(比如accounts)中创建自定义用户模型,指定新表名:

    from django.contrib.auth.models import AbstractUser
    
    class NewUser(AbstractUser):
        class Meta:
            db_table = 'new_auth_user'
    

    然后在settings.py中配置:

    AUTH_USER_MODEL = 'accounts.NewUser'
    
  • 自定义权限与组模型
    同样在accounts应用中创建对应模型,避免和旧表冲突:

    from django.contrib.auth.models import Group, Permission
    
    class NewGroup(Group):
        class Meta:
            db_table = 'new_auth_group'
    
    class NewPermission(Permission):
        class Meta:
            db_table = 'new_auth_permission'
    

    后续代码中使用NewGroup和NewPermission替代默认的Group、Permission。

  • 自定义核心系统表
    对其他django_*表做同样处理:

    # ContentType表
    from django.contrib.contenttypes.models import ContentType
    class NewContentType(ContentType):
        class Meta:
            db_table = 'new_django_content_type'
    
    # Session表
    from django.contrib.sessions.models import Session
    class NewSession(Session):
        class Meta:
            db_table = 'new_django_session'
    

    在settings.py中指定自定义Session模型:

    SESSION_MODEL = 'accounts.NewSession'
    
  • 自定义迁移记录表
    替换默认的django_migrations表,避免两个项目的迁移记录混乱:

    from django.db.migrations.recorder import MigrationRecorder
    
    class NewMigrationRecorder(MigrationRecorder):
        class Meta:
            db_table = 'new_django_migrations'
    
    # 在项目的apps.py中替换默认Recorder
    from django.db.migrations import recorder
    recorder.MigrationRecorder = NewMigrationRecorder
    
  • 执行迁移
    运行python manage.py makemigrations和python manage.py migrate,new_django会创建一套独立的系统表,完全不影响old_django的现有表。

方案2:业务模型全前缀隔离(简化版)

如果不想自定义所有系统模型,可以只给new_django的业务模型统一加前缀,同时修改系统表的迁移文件表名:

  1. 给所有业务模型的Meta类添加db_table = 'new_xxx'
  2. 执行python manage.py makemigrations生成迁移文件
  3. 手动修改每个内置应用(auth、contenttypes等)迁移文件中的db_table值,替换为带new_前缀的名称
  4. 执行migrate完成建表

注意:此方案需要每次Django升级后重新检查迁移文件,适合短期快速实现。

方案3:数据库视图映射(特殊场景)

如果无法创建新表(权限限制),可以给old_django的系统表创建带前缀的视图,让new_django指向这些视图。但此方案需要数据库管理员配合,且无法支持写入操作(除非用INSTEAD OF触发器),仅适合只读场景。


内容的提问来源于stack exchange,提问作者N. Maks

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 14:06:18