Django自定义用户模型创建超级用户时course_id非空约束报错问题
问题原因
你的自定义User模型中course字段为无默认值、无空值允许的外键字段,但创建超级用户的流程没有为该字段传入有效值,触发数据库非空约束报错。具体问题点如下:
User模型定义的course = models.ForeignKey(Course,on_delete=models.CASCADE)未设置null=True,属于必填字段- 你在
REQUIRED_FIELDS中仅声明了name、phone为必填字段,运行createsuperuser命令时Django不会提示输入course的值 UserManager的create_user、create_superuser方法也没有接收和处理course参数的逻辑,创建用户实例时course字段为空
解决方法
根据你的业务需求二选一即可:
方案1:要求所有用户(含超级用户)必须关联课程
- 修改
User模型的REQUIRED_FIELDS,新增course字段:
REQUIRED_FIELDS = ['name','phone','course']
- 调整
UserManager的两个方法,新增course参数并赋值:
class UserManager(BaseUserManager): def create_user(self,roll,phone,name,course,password=None): if not roll: # 注意原字符串单引号冲突问题,改用双引号包裹 raise ValueError("You Don't have Permission to do exam") user = self.model( roll=roll, phone=phone, name=name, course=course ) user.set_password(password) user.save(using=self._db) return user def create_superuser(self,roll,phone,name,course,password): user = self.create_user(roll,phone,name,course,password=password) user.is_admin = True user.is_staff=True user.save(using=self._db) return user
- 重新生成迁移文件并执行迁移,之后再运行
createsuperuser命令会自动提示你输入关联的课程ID。
方案2:仅普通用户需要关联课程,超级用户允许无课程
直接修改course字段的定义,允许空值即可:
course = models.ForeignKey(Course,on_delete=models.CASCADE, null=True, blank=True)
修改后重新生成迁移文件并执行迁移,再创建超级用户就不会触发非空约束报错。
另外注意你原代码中raise ValueError('You Don't have Permission to do exam')一行存在单引号嵌套冲突,会触发语法错误,建议改成双引号包裹字符串或者转义内部单引号。
内容的提问来源于stack exchange,提问作者Fred Oriabor
相关产品推荐
相关产品推荐

