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

自定义Django用户模型创建超级用户触发UNIQUE约束错误

解决Django自定义用户模型创建超级用户时的唯一约束错误

可能的原因及修复方案

1. 自定义id字段未设置自增

如果你的UserProfile模型手动定义了id字段,必须确保它是自增类型,否则Django无法自动生成唯一id值,插入时会触发唯一约束错误。

错误示例:

class UserProfile(AbstractBaseUser, PermissionsMixin):
    id = models.IntegerField(primary_key=True)  # 缺少自增配置
    email = models.EmailField(max_length=255, unique=True)
    name = models.CharField(max_length=255)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    # 其他必要配置(如USERNAME_FIELD等)

修复方式:
要么移除手动定义的id字段,使用Django默认的自增主键;要么将id改为自增类型:

# 方案1:使用默认自增主键(推荐)
class UserProfile(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(max_length=255, unique=True)
    name = models.CharField(max_length=255)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    # 其他必要配置
# 方案2:手动定义自增id
class UserProfile(AbstractBaseUser, PermissionsMixin):
    id = models.AutoField(primary_key=True)  # 使用AutoField实现自增
    email = models.EmailField(max_length=255, unique=True)
    name = models.CharField(max_length=255)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    # 其他必要配置

2. 检查自定义用户管理器的create_superuser方法

如果自定义了用户管理器,要确保create_superuser方法没有手动指定固定id值,否则多次创建会引发冲突。

错误示例:

class UserProfileManager(BaseUserManager):
    def create_superuser(self, email, name, password):
        user = self.create_user(email, name, password)
        user.id = 1  # 手动指定固定id,重复创建必冲突
        user.is_staff = True
        user.is_superuser = True
        user.save(using=self._db)
        return user

修复方式:
移除手动指定id的代码,让Django自动生成:

class UserProfileManager(BaseUserManager):
    def create_user(self, email, name, password=None):
        if not email:
            raise ValueError('Users must have an email address')
        
        email = self.normalize_email(email)
        user = self.model(email=email, name=name)

        user.set_password(password)
        user.save(using=self._db)

        return user

    def create_superuser(self, email, name, password):
        user = self.create_user(email, name, password)
        user.is_staff = True
        user.is_superuser = True
        user.save(using=self._db)
        return user

3. 彻底清理并重新初始化数据库

如果之前的清理不彻底,可能残留缓存或迁移记录,按以下步骤操作:

  • 停止Django服务器
  • 删除项目根目录下的db.sqlite3文件
  • 删除profiles_api/migrations目录下所有数字开头的迁移文件(保留__init__.py)
  • 删除所有__pycache__目录
  • 重新执行命令:
python manage.py makemigrations profiles_api
python manage.py migrate
python manage.py createsuperuser

验证步骤

完成修复后,执行createsuperuser命令,输入邮箱、密码后,检查是否成功创建超级用户,同时查看数据库profiles_api_userprofile表,确认id字段为自增且唯一。

内容的提问来源于stack exchange,提问作者albdev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 01:28:30