Django执行createsuperuser报错“邮箱不是有效UUID字段”求助
Django自定义用户模型创建超级用户时UUID错误的解决方案
问题根源
- 位置参数误用:
UserManager的create_user和create_superuser方法中,实例化self.model时用了位置参数,导致传入的email被赋值给模型第一个字段id(UUID类型),触发"不是有效UUID"的验证错误。 - 冗余字段定义:
UserAccount自行定义了password字段,但AbstractBaseUser已包含该字段,会引发字段冲突。 - __str__方法错误:调用父类
__str__的方式不正确,无法正确返回用户标识。 - 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
后续操作步骤
- 清理旧迁移(开发环境):若之前已执行过迁移,开发环境可重置数据库(注意备份数据):
py manage.py flush # 删除migrations目录下除__init__.py外的所有文件 py manage.py makemigrations py manage.py migrate - 创建超级用户:重新执行命令,此时会提示输入邮箱、用户名和密码:
py manage.py createsuperuser
关键说明
- 实例化模型必须用关键字参数明确指定字段值,避免位置参数与字段顺序不匹配导致的赋值错误。
- 不要重复定义
AbstractBaseUser或PermissionsMixin已包含的字段(如password、is_superuser),避免冲突。 REQUIRED_FIELDS需包含除USERNAME_FIELD外的必填字段,确保createsuperuser能正确收集参数。
内容的提问来源于stack exchange,提问作者theocode
相关产品推荐
相关产品推荐

