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

实现自定义User模型后执行createsuperuser报KeyError问题

问题原因与解决方法

核心错误

你代码里的REQUIRED_FIELDS = [diet]是错误的——这个列表需要填字段名称的字符串,而不是字段对象。直接写diet会把字段实例传进去,导致Django解析时无法识别正确的字段名,从而抛出FieldDoesNotExist异常。

修正后的模型代码

class MyUser(AbstractUser):
    username = None
    email = models.EmailField(_('email address'), unique=True)
    
    DIET_CHOICES = (
        ('vegan', 'Vegan'),
        ('vegetarian', 'Vegetarian'),
        ('meat', 'Meat')
    )

    diet = models.CharField(max_length=10, choices=DIET_CHOICES)

    USERNAME_FIELD = 'email'
    # 改成字符串形式的字段名
    REQUIRED_FIELDS = ['diet']

    objects = CustomUserManager()

    def __str__(self):
        return self.email

额外检查点

  1. CustomUserManager 适配
    确保你的CustomUserManager的create_user和create_superuser方法能接收diet参数,示例如下:

    class CustomUserManager(BaseUserManager):
        def create_user(self, email, password=None, **extra_fields):
            if not email:
                raise ValueError('The Email field must be set')
            email = self.normalize_email(email)
            user = self.model(email=email, **extra_fields)
            user.set_password(password)
            user.save(using=self._db)
            return user
    
        def create_superuser(self, email, password=None, **extra_fields):
            extra_fields.setdefault('is_staff', True)
            extra_fields.setdefault('is_superuser', True)
            return self.create_user(email, password, **extra_fields)
    

    修正后执行createsuperuser时,终端会提示你输入diet的选项值。

  2. Djoser 序列化器配置
    因为你用Djoser处理认证,需要自定义注册序列化器来包含diet字段,否则注册接口无法接收该参数:

    # 在你的app的serializers.py中
    from djoser.serializers import UserCreateSerializer
    from .models import MyUser
    
    class CustomUserCreateSerializer(UserCreateSerializer):
        class Meta(UserCreateSerializer.Meta):
            model = MyUser
            fields = ('email', 'password', 'diet')
    

    然后在settings.py里配置Djoser使用这个序列化器:

    DJOSER = {
        'SERIALIZERS': {
            'user_create': 'your_app_name.serializers.CustomUserCreateSerializer',
        }
    }
    
  3. 重新迁移(可选)
    修正代码后,若之前已执行过迁移,需要重新生成并应用迁移:

    python manage.py makemigrations
    python manage.py migrate
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:45:42