DRF-反序列化参数验证

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

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

总结,反序列化验证总结

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NeilNiu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值