在已承载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的业务模型统一加前缀,同时修改系统表的迁移文件表名:
- 给所有业务模型的
Meta类添加db_table = 'new_xxx' - 执行
python manage.py makemigrations生成迁移文件 - 手动修改每个内置应用(
auth、contenttypes等)迁移文件中的db_table值,替换为带new_前缀的名称 - 执行
migrate完成建表
注意:此方案需要每次Django升级后重新检查迁移文件,适合短期快速实现。
方案3:数据库视图映射(特殊场景)
如果无法创建新表(权限限制),可以给old_django的系统表创建带前缀的视图,让new_django指向这些视图。但此方案需要数据库管理员配合,且无法支持写入操作(除非用INSTEAD OF触发器),仅适合只读场景。
内容的提问来源于stack exchange,提问作者N. Maks

