反序列化-字段选项 validate、validate_<字段>、validator

发布时间 2023-03-27 11:33:30作者: 夜久听山雨

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.返回结果