关于Got AttributeError when attempting to get a value for field `password_confirm` on serializer `RegisterSerializer`. xxx.Original exception text was: 'User' object has no attribute 'password_confirm'.
在写一个drf的注册接口时报错,
我的序列化器:
class RegisterSerializer(serializers.ModelSerializer): password_confirm = serializers.CharField(label="确认密码",min_length=6,max_length=20,help_text="确认密码",error_messages={'min_length':'要求6~20个字符', 'max_length':'要求6-20个字符'}) token = serializers.CharField(label='生成token',read_only=True) class Meta: model = User fields = ('id', 'username', 'password', 'email', 'password_confirm','token') extra_kwargs = { 'username':{ 'label':'用户名', 'help_text':'用户名', 'min_length':6, 'max_length':20, 'error_messages':{ 'min_length':'要求6~20个字符', 'max_length':'要求6~20个字符' } }, 'email':{ 'label':'邮箱', 'help_text':'邮箱', 'write_only':True, 'required':True }, 'password':{ 'label':'密码', 'help_text':'密码', 'write_only':True, 'min_length':6, 'max_length':20, 'error_messages':{ 'min_length':'要求6~20个字符', 'max_length':'要求6~20个字符' } } } def validate(self, attrs): password = attrs.get('password') password_confirm = attrs.get('password_confirm') if password != password_confirm: raise serializers.ValidationError('两次密码输入不一致') return attrs def create(self, validated_data): # 移除数据库模型中不存在的属性 validated_data.pop('password_confirm') # 调用auth/models.py中给出的额create_user(),实现了规范邮箱格式、设置用户级别是否是超级管理员用户、给密码加密保存等一系列操作 user = User.objects.create_user(**validated_data) # 内部调用django模型类的save()方法 # 手动生成token jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER payload = jwt_payload_handler(user) token = jwt_encode_handler(payload) user.token = token return user
原因可能在于 确认密码 字段数据库中是没有的,是不需要存入数据库的,但是在视图的响应中会将其进行序列化输出。所以需对password_confirm字段添加write_only=True属性。