Django Shell无法存储数据到自定义User模型,报非空字段错误求助
问题排查与解决方案
核心问题分析
- 模型继承错误:
User类错误继承了BaseUserManager,该类是用户管理器的基类而非模型基类,会导致模型字段处理逻辑异常,无法正确接收name参数。 - 重复定义密码字段:
AbstractUser已内置密码管理机制,手动定义password字段会破坏原有逻辑,引发字段冲突。 - 必填字段配置缺失:
name是必填的CharField,但未加入REQUIRED_FIELDS列表,Django创建用户时未强制校验该字段传入。 - 笔误问题:Shell中导入的是
Users,但模型类名为User,需修正。
修正后的代码
自定义User模型类
from django.contrib.auth.models import AbstractUser, BaseUserManager from django.db import models class User(AbstractUser): username = None name = models.CharField(max_length=255) created_by = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True) email = models.EmailField(unique=True) is_active = models.BooleanField(default=True) is_staff = models.BooleanField(default=False) is_admin = models.BooleanField(default=False) is_verified = models.BooleanField(default=False) date_joined = models.DateTimeField(auto_now_add=True) USERNAME_FIELD = 'email' REQUIRED_FIELDS = ['name'] objects = ContentManager() def __str__(self): return self.email
User模型的manager.py代码
from django.contrib.auth.models import BaseUserManager class ContentManager(BaseUserManager): use_in_migrations = True def create_user(self, email, password=None, **extra_fields): if not email: raise ValueError("Email must be set") email = self.normalize_email(email) user = self.model(email=email, **extra_fields) if password: user.set_password(password) user.save(using=self._db) return user def create_superuser(self, email, password, **extra_fields): extra_fields.setdefault('is_staff', True) extra_fields.setdefault('is_admin', True) extra_fields.setdefault('is_superuser', True) if 'name' not in extra_fields: raise ValueError("Superuser must have a name") return self.create_user(email, password, **extra_fields)
后续操作步骤
- 执行数据库迁移(修改模型后必须执行):
python manage.py makemigrations python manage.py migrate
- 在Django Shell中正确创建用户:
python manage.py shell from api.models import User user = User.objects.create_user(name="roshan", email="example@example.com", password="password")
内容的提问来源于stack exchange,提问作者Roshan Ojha
相关产品推荐
相关产品推荐

