基于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
相关产品推荐
相关产品推荐

