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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:37:53