实现自定义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
额外检查点
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的选项值。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', } }重新迁移(可选)
修正代码后,若之前已执行过迁移,需要重新生成并应用迁移:python manage.py makemigrations python manage.py migrate
内容的提问来源于stack exchange,提问作者wardz
相关产品推荐
相关产品推荐

