一、反序列化参数验证步骤

1、先去序列化器中指定每个字段的验证参数

2、在视图当中使用我们创建的序列化器,并且把传递的入参交给data参数,生成一个对象,用对象点is_valid() 来进行验证。 验证方法,一旦调用这个is_valid()方法,就会调用序列化器里的数据内容是否符合要求,想看下验证结果,如何查看验证结果呢,通过对象点errors来查看,同时如果加了raise_exception=True, raise_exception=True 的含义是,一旦检出错误,自动return,不用我们手写return

代码如下

from rest_framework import serializers


class HeroSerializer(serializers.Serializer):
    # 英雄序列化器
    hname = serializers.CharField()
    hcomment = serializers.CharField()

    # 多对一的场景
    # hbook = serializers.PrimaryKeyRelatedField()
    hbook = serializers.StringRelatedField()


# 自定义序列化器,本质就是一个类
class BookSerializer(serializers.Serializer):

    # 序列化返回的字段
    btitle = serializers.CharField(max_length=20, min_length=5)
    bread = serializers.IntegerField(max_value=100, min_value=5)
    bpub_date = serializers.DateField(required=False) # 一旦加上required=False ,不传也不会报错了。
    bcomment = serializers.IntegerField(default=10)
    # 一对多的场景,总共有三种返回嵌套的形式:
    # 1、返回关联的英雄id PrimaryKeyRelatedField
    # heroinfo_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True)
    # 2、返回关联英雄的模型类的str方法值
    # heroinfo_set = serializers.StringRelatedField(read_only=True, many=True)
    # 3、想返回英雄类里的其他字段值,需要再定义一个英雄的序列化器,需要注意的是,嵌套的序列化器,
    # 必须先于这个序列化器,否则代码加载的时候,找不到这个新建序列化器就报错了
    heroinfo_set = HeroSerializer(many=True)
class Books(View):

    def get(self, request):
        books = BookInfo.objects.all()
        # 多个对象返回的时候需要加上many=True
        ser = BookSerializer(books, many=True)
        return JsonResponse(ser.data, safe=False)

    def post(self, request):
        # 1、获取请求数据
        # 2、验证请求数据
        # 3、保存数据
        # 4、返回结果
        data = request.body.decode()  #“{}”
        data_dict = json.loads(data)   # 转换成字典 {}
        ser = BookSerializer(data=data_dict)
        ser.is_valid(raise_exception=True)  # 验证方法,一旦调用这个is_valid()方法,就会调用序列化器里的数据内容是否符合要求,想看下验证结果
        # raise_exception=True 的含义是,一旦检出错误,自动return,不用我们手写return
        return JsonResponse(ser.errors)

二、字段选项验证,四种常用参数验证,

1、max_length=20, min_length=5,最大长度,最小长度

2、max_value=100, min_value=5,最大值,最小值

3、(required=False,默认的时候required=True,必传默认是True

4、default=10,按照默认值进行验

以上字段是同一套字段使用的。

5、read_only,只参与序列化返回过程,不再参与反序列化验证,read读取,就是返回给前端数据

6、write_only,只参与反序列化验证过程,不再参与序列化返回,write写,就是前端数据传给后端print(ser.validated_data) # validated_data 查看验证后的数据

三、自定义方法验证

1、单一字段验证,调用到视图里的is_valid方法时候,就会调用到序列化器里的自己定义的验证方法validate_btitle

# 单一字段验证,例如验证btitle的值,方法名必须要这么写,value 就是接收这个字段的值的
    def validate_btitle(self, value):
        if value == 'python':
            raise serializers.ValidationError('书名不能是python')
        return value

2、多个字段验证

# 多个字段验证
    def validate(self, attrs):
        if attrs['bread'] > attrs['bcomment']:
            raise serializers.ValidationError('阅读量大于评论量')
        return attrs

总结,反序列化验证总结

DRF-反序列化参数验证_restful