自定义序列化器类继承serializers.ModelSerializer实现模型数据简化映射到json格式

1.下面是如何继承serializers.ModelSerializer,其中fields域是自己需要的数据转为json的,其中password_ok,phone_string是模型类里面没有的,所以必须以 password_ok = serializers.CharField(label=‘确认密码’,write_only=True)这种格式进行书写,才能转为json格式,但fields中’username’,‘phone’,'password’三个字段是模型类中已经定义了,因此不需要再像前面的password_ok,phone_string这两个字段再重申明,因此继承serializers.ModelSerializer类非常方便。

class UserSerializer(serializers.ModelSerializer):
    """确定需要验证的字段"""
    password_ok = serializers.CharField(label='确认密码',write_only=True)
    phone_string=serializers.CharField(label='短信验证码',write_only=True)
    class Meta:
        model = Users
        fields = ('username','phone','password','password_ok','phone_string')

2.继承serializers.ModelSerializer类,必须要重写create()方法,否则会报错,
但validate()是可以校验多个属性,可以不重写,但最好写,写序列化就是为了能校验数据,因此最好也重写该validate()方法。

 #校验多个属性
    def validate(self,data):
        """校验用户名长度,格式校验已经在abstractuser中设置好了"""
        username=data['username']
        if 6 > len(username) or len(username) > 12:
            raise serializers.ValidationError('用户名的长度必须在6~12位之间')
        """校验密码的长度"""
        password=data['password']
        if 8>len(password) or len(password) > 12:
            raise serializers.ValidationError('密码长度必须在8~12位之间')
        """校验输入密码和确认密码值是否相等"""
        password_ok=data['password_ok']
        if password_ok != password:
            raise serializers.ValidationError('密码和确认密码不相等')
        """输入的验证码是否正确和过期,已近在获取手机验证码之前验证过了"""


        """校验输入的短信验证码是否正确"""
        phone_string = data['phone_string']
        phone = data['phone']

        # 从redis取出真正的手机验证码数据
        con = get_redis_connection()
        true_phone_string = con.get(phone)
        if not true_phone_string:
            raise serializers.ValidationError('短信验证吗失效')
        if true_phone_string.decode() != phone_string:
            raise serializers.ValidationError('短信验证码错误')
        return data
    def create(self,validated_data):
        """保存数据"""
        print('#######这是进入了create函数#####')
        print(validated_data)
        #super(UserSerializer,self).create(validated_data)
        del validated_data['password_ok']
        del validated_data['phone_string']

        username=validated_data['username']
        password=validated_data['password']

        # user=Users.objects.create_user(**validated_data)
        # user=Users.objects.create(**validated_data)
        # user =super().create(validated_data)
        # user.set_password(validated_data['password'])
        # user.save()
        return validated_data

3.调用自定义的序列化器

from rest_framework.generics import CreateAPIView
from .serializers import UserSerializer
class UserView(CreateAPIView):
    serializer_class = UserSerializer

猜你喜欢

转载自blog.csdn.net/qq_36455530/article/details/85317029
今日推荐