MobileCustomer类未定义password字段引发数据库迁移错误求助
问题解决:Django migrate时password字段不可为空报错
问题原因
你的MobileCustomer继承了AbstractUser,而AbstractUser自带不可为空的password字段。当数据库中已有MobileCustomer的表(存在现有数据行),执行迁移时需要为所有现有行填充password值,但未指定默认值,因此触发该错误。
修复方案
方案一:临时快速处理(测试环境适用)
当migrate命令弹出选项时,选择选项1,输入一个Django兼容的哈希密码作为默认值(可先在Django shell中执行from django.contrib.auth.hashers import make_password; print(make_password('你的临时密码'))生成哈希值,再复制输入)。
- 注意:该操作会将所有现有用户的密码统一设置为这个默认值,生产环境慎用,会导致旧用户无法用原密码登录。
方案二:代码层定义默认值(生产环境推荐)
- 修改
MobileCustomer模型,添加password字段并指定哈希默认值(同时移除冗余的PermissionsMixin继承,因为AbstractUser已包含该类):from django.contrib.auth.hashers import make_password from django.contrib.auth.models import AbstractUser, Permission from django.utils.translation import gettext_lazy as _ class MobileCustomer(AbstractUser): email = models.EmailField(_('email address'), unique=True) first_name = models.CharField(max_length=120, default='') last_name = models.CharField(max_length=120, default='') contact = models.CharField(max_length=120, default='') user_permissions = models.ManyToManyField( Permission, verbose_name=_('user permissions'), blank=True, help_text=_('The permissions this user has'), related_name='mobileuser_set' ) # 为password字段设置哈希默认值 password = models.CharField(_('password'), max_length=128, default=make_password('initial_default_pwd')) USERNAME_FIELD = 'email' REQUIRED_FIELDS = ('username',) objects = MobileUserManager() def __str__(self): return self.email - 生成迁移文件:
python manage.py makemigrations - 执行迁移:
python manage.py migrate - (生产环境后续操作):通过后台管理或脚本为现有用户重置真实密码后,可移除该默认值配置。
内容的提问来源于stack exchange,提问作者Modou Lamin
相关产品推荐
相关产品推荐

