注意:验证的顺序是,先验证单字段,再验证多字段
一.序列化的文件,serializers.py代码示例
1.单字段校验(方式一)
class StudentSerializer(serializers.Serializer):
name = serializers.CharField(max_length=8,required=True)
age = serializers.IntegerField(max_value=120,required=True)
sex = serializers.IntegerField(default=1)
#validate_name函数名中的name必现为定义的字段名,attr参数可以接收该字段名传入的值
def validate_name(self,attr):
if attr == "老王":
raise serializers.ValidationError('隔壁老王不能进')
#不管在校验什么字段,都需要将数据返回,不然后续不能获取到数据
return attr
2.单字段校验(方式二)
from rest_framework import serializers
#该函数名可以自己随意定义
def chick_class_name(data):
if data == "老王":
raise serializers.ValidationError('隔壁老王不行')
#不管在校验什么字段,都需要将数据返回,不然后续不能获取到数据
return data
class StudentSerializer(serializers.Serializer):
name = serializers.CharField(max_length=8,required=True,validators=[chick_class_name]) #将自己定义的函数名,传入要校验字段的validators属性中
age = serializers.IntegerField(max_value=120,required=True)
sex = serializers.IntegerField(default=1)
3.多字段校验
from rest_framework import serializers
class StudentSerializer(serializers.Serializer):
name = serializers.CharField(max_length=8,required=True)
age = serializers.IntegerField(max_value=120,required=True)
sex = serializers.IntegerField(default=1)
def validate_name(self,attr):
if attr == "老王":
raise serializers.ValidationError('隔壁老王不能进')
#不管在校验什么字段,都需要将数据返回,不然后续不能获取到数据
return attr
#预留的钩子函数,会将传入的数据获取,用参数attrs接收,通过字典的方式,可以取到里面的任意字段
def validate(self, attrs):
if attrs.get('name') == "张三" and attrs.get('age') == 26:
raise serializers.ValidationError('26岁的张三不能进')
#不管在校验什么字段,都需要将数据返回,不然后续不能获取到数据
return attrs
二.视图函数示例代码,views.py
from django.views import View
from django.http import HttpResponse
from unsers.serializers import StudentSerializer
import json
# Create your views here.
class StudentView(View):
#在发送POST请求的时候,记得先关闭一下CRSF中间件
def post(self,request):
data = json.loads(request.body)
#将序列化的数据传入定义的反序列化类中,用data参数接收
#'django.middleware.csrf.CsrfViewMiddleware', 在settings中注释掉该中间件就可以了
#模拟post请求,可以用postman
serializers = StudentSerializer(data=data)
if serializers.is_valid():# is_valid(),可以进行数据校验,校验通过返回True,失败返回False
print(serializers.data) #无论验证是否通过,都会返回一个普通字典
print(serializers.validated_data) #验证通过,返回一个有序字典,验证失败,返回一个空字典
return HttpResponse("验证成功")
else:
print(serializers.errors) #验证失败,返回错误字段和错误信息
return HttpResponse("验证失败")