一、反序列化参数验证步骤
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
总结,反序列化验证总结