使用Django 2.1.5+Oracle,如何重命名auth模块的数据库表?
重命名Django Auth相关表的解决方案(适配Django 2.1.5 + Oracle)
我来给你详细说说怎么搞定这个需求——毕竟Django默认的auth表(比如auth_user、auth_group这些)确实没法直接改表名,得通过自定义模型的方式来实现,而且要注意一些关键细节,尤其是你用的还是Oracle数据库。
核心思路
Django的auth系统是可扩展的,我们可以通过继承官方提供的抽象模型,然后自定义db_table属性来指定符合要求的表名。重点提醒:一定要在项目第一次执行migrate之前就配置好这些,不然后期改起来会非常麻烦!
步骤1:自定义用户模型
首先处理最核心的用户表,我们继承AbstractUser(保留所有默认字段和功能),然后在Meta类里指定表名:
# 比如在你的accounts应用的models.py里 from django.contrib.auth.models import AbstractUser from django.db import models class CustomUser(AbstractUser): class Meta: # 替换成你的项目前缀,比如项目叫myproj,就是myproj_user_TAB db_table = "myproj_user_TAB" verbose_name = "用户" verbose_name_plural = "用户"
然后在settings.py里告诉Django用我们的自定义用户模型:
AUTH_USER_MODEL = "accounts.CustomUser" # 这里的accounts是你的应用名,按需修改
步骤2:自定义组模型
接下来是组表auth_group,同样继承官方的抽象模型来改表名:
# 还是在accounts/models.py里 from django.contrib.auth.models import AbstractBaseGroup, PermissionsMixin from django.db import models from django.utils.translation import gettext_lazy as _ class CustomGroup(AbstractBaseGroup, PermissionsMixin): class Meta: db_table = "myproj_group_TAB" # 替换成你的项目前缀 verbose_name = _("组") verbose_name_plural = _("组")
然后在settings.py里指定自定义组模型:
AUTH_GROUP_MODEL = "accounts.CustomGroup"
步骤3:自定义权限模型
权限表auth_permission也用同样的方式处理:
# accounts/models.py from django.contrib.auth.models import AbstractBasePermission from django.db import models from django.utils.translation import gettext_lazy as _ class CustomPermission(AbstractBasePermission): class Meta: db_table = "myproj_permission_TAB" # 替换成你的项目前缀 verbose_name = _("权限") verbose_name_plural = _("权限")
步骤4:处理多对多关联表
用户和组、用户和权限、组和权限之间的关联表(默认是自动生成的,比如auth_user_groups)也需要改成符合要求的表名,这时候我们需要显式定义中间模型:
用户-组关联表
在CustomUser模型里修改groups字段,指定中间表:
class CustomUser(AbstractUser): # 覆盖原有的groups字段,指定中间模型 groups = models.ManyToManyField( CustomGroup, verbose_name=_('组'), blank=True, help_text=_( '用户所属的组,用户将继承组的所有权限' ), related_name="user_set", related_query_name="user", through='CustomUserGroup', # 指定中间模型 ) # 同样处理用户-权限关联 user_permissions = models.ManyToManyField( CustomPermission, verbose_name=_('用户权限'), blank=True, help_text=_('用户的专属权限'), related_name="user_set", related_query_name="user", through='CustomUserPermission', ) # 定义用户-组中间表 class CustomUserGroup(models.Model): user = models.ForeignKey(CustomUser, on_delete=models.CASCADE) group = models.ForeignKey(CustomGroup, on_delete=models.CASCADE) class Meta: db_table = "myproj_user_group_TAB" unique_together = ('user', 'group') # 定义用户-权限中间表 class CustomUserPermission(models.Model): user = models.ForeignKey(CustomUser, on_delete=models.CASCADE) permission = models.ForeignKey(CustomPermission, on_delete=models.CASCADE) class Meta: db_table = "myproj_user_permission_TAB" unique_together = ('user', 'permission')
组-权限关联表
在CustomGroup模型里修改permissions字段:
class CustomGroup(AbstractBaseGroup, PermissionsMixin): # 覆盖原有的permissions字段,指定中间模型 permissions = models.ManyToManyField( CustomPermission, verbose_name=_('组权限'), blank=True, help_text=_('组的专属权限'), related_name="group_set", related_query_name="group", through='CustomGroupPermission', ) # 定义组-权限中间表 class CustomGroupPermission(models.Model): group = models.ForeignKey(CustomGroup, on_delete=models.CASCADE) permission = models.ForeignKey(CustomPermission, on_delete=models.CASCADE) class Meta: db_table = "myproj_group_permission_TAB" unique_together = ('group', 'permission')
步骤5:执行迁移
所有模型定义好之后,执行以下命令生成迁移文件并应用到Oracle数据库:
python manage.py makemigrations python manage.py migrate
额外注意事项
- Oracle命名规则:Oracle的表名默认长度不能超过30字符,如果你项目前缀比较长,要注意组合后的表名不要超过这个限制(Oracle 12c及以上支持更长的名称,但最好提前确认)。
- 功能验证:自定义模型后,一定要测试登录、权限分配、组管理这些核心功能,确保和默认auth系统的行为一致。
- 已迁移项目的处理:如果你的项目已经执行过
migrate,默认auth表已经存在,这时候再改的话需要手动删除原有表或者调整迁移文件,操作风险较高,建议备份数据库后再尝试。
内容的提问来源于stack exchange,提问作者Felix Gehrmann
相关产品推荐
相关产品推荐

