1.使用序列化器进行反序列化时,需要对数据进行验证后,才能获取验证成功的数据或保存成模型类对象。
2.在获取反序列化的数据前,必须调用is_valid()方法进行验证,验证成功返回True,否则返回False。
3.验证失败,可以通过序列化器对象的errors属性获取错误信息,返回字典,包含了字段和字段的错误。如果是非字段错误,可以通过修改REST framework配置中的NON_FIELD_ERRORS_KEY来控制错误字典中的键名。
4.验证成功,可以通过序列化器对象的validated_data属性获取数据。
5.在定义序列化器时,指明每个字段的序列化类型和选项参数,本身就是一种验证行为。
序列化器:3种验证方式
1.可添加error_messages来显示报错信息
from rest_framework import serializers from .models import Student class StudentSerializer(serializers.Serializer): # 学生信息序列化器 #1.转换的字段说明 #客户端字段=serializers.字段类型(选项=选项值) id=serializers.IntegerField(read_only=True) #反序列化阶段不要求 name=serializers.CharField(required=True) #反序列化阶段必填 sex=serializers.BooleanField(default=True) #默认值
classmate=serializers.CharField(validators=[check_classmate])#不能是字符串
age=serializers.IntegerField(max_value=50,min_value=5,error_messages={
"min_value":"必须大于等于5岁", "max_value":"必须小于等于50岁", }) description=serializers.CharField(allow_null=True,allow_blank=True)#允许客户端不填内容,或者值为""
2.验证单个字段:
def validate_name(self,data):#方法名必须是validate_<字段名>,否则序列化器不识别 #validate开头的方法会被is_valid调用 #验证单个字段 if data in ["python","django"]: #验证失败可以通过抛出异常的方式告知is_valid raise serializers.ValidationError(detail="学生姓名错误",code="validate_name") #验证成功必须返回数据 return data
2.验证多个字段:
def validate(self,attrs):#名字固定叫validate #验证客户端的所有数据 if attrs["classmate"]=="8" and attrs["sex"]: raise serializers.ValidationError(detail="8班只有女生",code="validate") return attrs
3.外部验证函数:
def check_classmate(data): if len(data)!=3: raise serializers.ValidationError(detail="班级是三个字符",code="check_classmate") return data
classmate=serializers.CharField(validators=[check_classmate])#不能是字符串
视图:
验证失败不抛出异常:
from django.views import View from .models import Student from .serializers import StudentSerializer from django.http.response import JsonResponse import json class StudentView(View): def get(self,request): #反序列化,采用字段选项来验证数据,验证失败不抛出异常 #1.获取数据 #data=json.dumps(request.body) #模拟来自客户端的数据 data={ "name":"xiaoming", "age":30, "sex":True, "classmate":6, "description":"sadasda", } #2.实例化序列化器,得到序列化对象 serializer=StudentSerializer(data=data) #3.调用序列化器进行数据验证 ret=serializer.is_valid()#raise_exception=True验证失败抛出异常 #4.获取验证后的结果 if ret: return JsonResponse(serializer.validated_data)#validated_data不能加(),是一个属性 else: return JsonResponse(serializer.errors) #5.操作数据库 #6.返回结果
验证失败抛出异常:
from django.views import View from .models import Student from .serializers import StudentSerializer from django.http.response import JsonResponse import json class StudentView(View): def get(self,request): #反序列化,采用字段选项来验证数据,验证失败抛出异常 #1.获取数据 #data=json.dumps(request.body) #模拟来自客户端的数据 data={ "name":"django", "age":12, "sex":True, "classmate":6, "description":"sadasda", } #2.实例化序列化器,得到序列化对象 serializer=StudentSerializer(data=data) #3.调用序列化器进行数据验证 ret=serializer.is_valid(raise_exception=True)#验证失败抛出异常 #4.获取验证后的结果 return JsonResponse(serializer.validated_data)#validated_data不能加(),是一个属性 #5.操作数据库 #6.返回结果
标签:serializers,验证,validator,import,validate,序列化,data From: https://www.cnblogs.com/fuck-Innovative-training/p/16639569.html