Django创建超级用户报CustomUser matching query does not exist如何解决?
故障原因与解决方案
直接报错原因
你的post_save信号逻辑存在错误:触发信号时传入的instance本身就是刚刚完成保存的CustomUser实例,你却用实例对象去匹配username字符串字段,永远不可能查询到对应数据,直接抛出DoesNotExist错误。
其他隐含问题
- 你在
CustomUser类中重复定义了password字段,且仅设置了15位长度。Django默认会将密码哈希后存储,哈希后的字符串长度远大于15位,会被直接截断,后续即便创建用户成功也无法通过密码校验登录。 - 信号逻辑没有判断是否为新建用户操作,后续更新
CustomUser信息时会重复触发创建UserProfile的逻辑,抛出一对一关联重复的报错。 - 额外冗余查询:完全不需要在信号中再次查询
CustomUser,直接使用传入的instance即可。
修复步骤
- 修正信号函数代码:
def CreateProfile(sender, instance, created, **kwargs): # 仅在新建用户时创建关联Profile if created: print("profile create too..") # 直接使用已保存的CustomUser实例,无需额外查询 UserProfile.objects.create(user=instance)
- 删除
CustomUser类中冗余的password字段定义,AbstractUser原生已包含符合要求的密码字段,无需重写。修正后的CustomUser代码如下:
class CustomUser(AbstractUser): email = models.EmailField(max_length=250, null=False, unique=True) name = models.CharField(max_length=50, null=False) username = models.CharField(max_length=50, null=False) USERNAME_FIELD = 'email' REQUIRED_FIELDS = ['name', 'username']
- 确认项目
settings.py中已配置自定义用户模型:
# 替换为你的用户应用名称 AUTH_USER_MODEL = 'user.CustomUser'
- 重置迁移文件解决历史遗留的字段错误:
- 删除用户应用下
migrations目录中除__init__.py外的所有文件 - 删除当前使用的数据库文件
- 重新执行迁移命令:
python manage.py makemigrations python manage.py migrate - 删除用户应用下
- 重新执行
python manage.py createsuperuser即可正常创建超级用户。
内容的提问来源于stack exchange,提问作者Atharva
相关产品推荐
相关产品推荐

