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

Django Shell无法存储数据到自定义User模型,报非空字段错误求助

问题排查与解决方案

核心问题分析

  1. 模型继承错误:User类错误继承了BaseUserManager,该类是用户管理器的基类而非模型基类,会导致模型字段处理逻辑异常,无法正确接收name参数。
  2. 重复定义密码字段:AbstractUser已内置密码管理机制,手动定义password字段会破坏原有逻辑,引发字段冲突。
  3. 必填字段配置缺失:name是必填的CharField,但未加入REQUIRED_FIELDS列表,Django创建用户时未强制校验该字段传入。
  4. 笔误问题: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)

后续操作步骤

  1. 执行数据库迁移(修改模型后必须执行):
python manage.py makemigrations
python manage.py migrate
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:32:33