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

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:要求所有用户(含超级用户)必须关联课程

  1. 修改User模型的REQUIRED_FIELDS,新增course字段:
REQUIRED_FIELDS = ['name','phone','course']
  1. 调整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
  1. 重新生成迁移文件并执行迁移,之后再运行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:57:00