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

Django执行createsuperuser报错“邮箱不是有效UUID字段”求助

Django自定义用户模型创建超级用户时UUID错误的解决方案

问题根源

  1. 位置参数误用:UserManager的create_user和create_superuser方法中,实例化self.model时用了位置参数,导致传入的email被赋值给模型第一个字段id(UUID类型),触发"不是有效UUID"的验证错误。
  2. 冗余字段定义:UserAccount自行定义了password字段,但AbstractBaseUser已包含该字段,会引发字段冲突。
  3. __str__方法错误:调用父类__str__的方式不正确,无法正确返回用户标识。
  4. REQUIRED_FIELDS缺失:未将username加入必填字段,创建超级用户时会缺少必要参数。

修改后的代码

models.py

import uuid
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
from django.core.exceptions import FieldError


class UserManager(BaseUserManager):
    def create_user(self, email, username, password, **kwargs):
        if not email:
            raise ValueError('Email must be given!')
        kwargs.setdefault('is_active', True)
        kwargs.setdefault('is_superuser', False)
        email = self.normalize_email(email)

        # 使用关键字参数实例化,避免位置参数赋值错误
        user = self.model(email=email, username=username, **kwargs)
        user.set_password(password)
        user.save(using=self._db)
        return user 
    
    def create_superuser(self, email, username, password, **kwargs):
        if not email:
            raise ValueError('Email must be given!')
        kwargs.setdefault('is_active', True)
        kwargs.setdefault('is_superuser', True)
        email = self.normalize_email(email)

        # 用关键字参数,同时补充username参数
        superuser = self.model(email=email, username=username, **kwargs)
        superuser.set_password(password)
        superuser.save(using=self._db)
        return superuser


class UserAccount(AbstractBaseUser, PermissionsMixin):
    id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, primary_key=True)
    email = models.CharField(max_length=250, unique=True, null=False)
    username = models.CharField(max_length=250, unique=True, null=False)
    # 移除冗余的password字段,AbstractBaseUser已包含
    is_active = models.BooleanField(default=False)
    is_verified = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    created_time = models.DateTimeField(auto_now_add=True, null=False)
    last_login = models.DateTimeField(auto_now=True)


    class Meta:
        unique_together = ['id', 'email', 'username']
    
    USERNAME_FIELD = 'email'
    # 将username加入必填字段,createsuperuser会提示输入
    REQUIRED_FIELDS = ['username']

    objects = UserManager()

    # 修正__str__方法,直接返回用户邮箱
    def __str__(self) -> str:
        return self.email
    
    def has_perms(self, perm, obj=None):
        return self.is_superuser
    
    def get_full_name(self) -> str:
        return self.username
    
    def has_module_perms(self, app_label):
        return True

后续操作步骤

  1. 清理旧迁移(开发环境):若之前已执行过迁移,开发环境可重置数据库(注意备份数据):
    py manage.py flush
    # 删除migrations目录下除__init__.py外的所有文件
    py manage.py makemigrations
    py manage.py migrate
    
  2. 创建超级用户:重新执行命令,此时会提示输入邮箱、用户名和密码:
    py manage.py createsuperuser
    

关键说明

  • 实例化模型必须用关键字参数明确指定字段值,避免位置参数与字段顺序不匹配导致的赋值错误。
  • 不要重复定义AbstractBaseUser或PermissionsMixin已包含的字段(如password、is_superuser),避免冲突。
  • REQUIRED_FIELDS需包含除USERNAME_FIELD外的必填字段,确保createsuperuser能正确收集参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 22:57:37