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 datap
#验证多个字段
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/chenxdnote/p/17260986.html