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

基于AbstractBaseUser自定义User模型时出现id字段类型错误

Django自定义User模型注册报错:id字段收到字符串值的解决方案

问题场景

基于AbstractBaseUser自定义Django的User模型,调用注册接口时触发错误:字段'id'期望数字类型,但传入了'test123'。错误栈显示保存用户时id字段接收到字符串值。查看迁移文件确认id为自动生成的BigAutoField,尝试过重新执行makemigrations、migrate,删除迁移文件重建、清空数据库,问题仍存在。

错误原因

问题出在UserManager的create_user和create_superuser方法中:

  • 实例化self.model时使用了位置参数,而Django模型构造方法的第一个位置参数对应pk(即id字段),导致传入的username被赋值给了id字段,引发类型不匹配。
  • create_superuser方法中存在重复实例化User对象的问题,会覆盖create_user方法中设置的密码等信息,同时也犯了位置参数的错误。

修复方案

修改UserManager.create_user方法

将实例化模型的位置参数改为关键字参数:

原错误代码:

user = self.model(username, email=self.normalize_email(email))

修复后代码:

user = self.model(username=username, email=self.normalize_email(email))

修改UserManager.create_superuser方法

移除重复的模型实例化,直接在create_user返回的对象上修改权限字段,同时确保调用create_user时使用关键字参数:

原错误代码:

user = self.create_user(username, email, password)
user = self.model(username, email=self.normalize_email(email))
user.is_superuser = True
user.is_staff = True
user.save()

修复后代码:

user = self.create_user(username=username, email=email, password=password)
user.is_superuser = True
user.is_staff = True
user.save()
return user

验证

修改完成后,重新启动Django服务,使用Postman发送注册请求:

{
    "email": "test@test.com",
    "username": "test123",
    "password": "123456"
}

此时用户应该能正常创建,不会再出现id字段类型错误。

内容的提问来源于stack exchange,提问作者Sid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 20:40:29