Django用户注册接口问题:仅Username存入数据库,其他字段失败
问题原因
你的RegisterSerializer核心问题出在create方法:你只向User.objects.create()传入了username字段,first_name、email等其他字段虽然通过了序列化校验(存在于validated_data中),但并没有被用来创建User实例或赋值保存,所以这些字段的数据无法存入数据库。
另外还有两个细节问题:
is_admin不是Django默认User模型的字段,默认User模型用is_staff标识管理员权限,若未自定义User模型,这个字段不会生效。- 手动声明的
email字段应该用serializers.EmailField而非CharField,这样能自动完成邮箱格式校验。
修正后的代码
from django.contrib.auth.models import User from django.contrib.auth.password_validation import validate_password from rest_framework import serializers class RegisterSerializer(serializers.ModelSerializer): email = serializers.EmailField(required=True) # 改为EmailField做格式校验 first_name = serializers.CharField(max_length=50, required=True) last_name = serializers.CharField(max_length=50, required=True) password = serializers.CharField( write_only=True, required=True, validators=[validate_password]) password2 = serializers.CharField(write_only=True, required=True) # 替换默认User模型不存在的is_admin为is_staff is_staff = serializers.BooleanField(default=False) class Meta: model = User fields = ('username', 'first_name', 'last_name', 'email', 'password', 'password2', 'is_staff') def validate(self, attrs): if attrs['password'] != attrs['password2']: raise serializers.ValidationError( {"password": "Password fields didn't match."}) # 移除模型不需要的password2字段 attrs.pop('password2') return attrs def create(self, validated_data): # 解包所有校验后的字段,一次性创建User实例 user = User.objects.create(**validated_data) user.set_password(validated_data['password']) user.save() return user
关键修改说明
create方法优化:使用**validated_data解包所有校验通过的字段(已在validate中移除password2),一次性传入User.objects.create(),确保所有字段都被正确赋值。- 邮箱字段修正:替换为
EmailField,自动校验邮箱格式,避免无效数据存入。 - 管理员字段修正:改用默认User模型的
is_staff字段;若自定义了包含is_admin的User模型,可保留原字段。 - 清理冗余字段:在
validate方法中移除password2,避免传入模型创建方法引发错误。
内容的提问来源于stack exchange,提问作者Abz
相关产品推荐
相关产品推荐

