关于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属性。

 

posted @ 2021-09-19 09:27  天青色wy  阅读(430)  评论(0编辑  收藏  举报