首页 > 其他分享 >序列化器:反序列换-字段选项 validate validate_<字段> validator

序列化器:反序列换-字段选项 validate validate_<字段> validator

时间:2022-08-30 17:33:18浏览次数:66  
标签:serializers 验证 validator import validate 序列化 data

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

相关文章

  • 序列化器:序列化一个模型对象和多个模型对象
    1.序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串2.反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型......
  • 序列化与反序列化
    1.参与序列化的对象必须实现Serializable接口,起到相应的标识作用,Java虚拟机会给该类自动生成一个序列化版本号2.java通过类名+序列化版本号的方式进行区分,transient关......
  • [CISCN2019 华北赛区 Day1 Web2]ikun-1|python反序列化
    考点:JWT身份伪造、pythonpickle反序列化、逻辑漏洞1、打开之后首页界面直接看到了提示信息,信息如下:2、那就随便注册一个账号进行登录,然后购买lv6,但是未发现lv6,那就查看......
  • maybe_serialize() | WordPress序列化数据/数组/对象
    函数maybe_serialize(string|array|object$data)描述该WordPress函数可将数组/对象/字符串序列化。参数$data,(string|array|object)需要序列化的数据。返回值(m......
  • drf的序列化
    1.序列化的基类BaseSerializerfromrest_frameworkimportserializersserializers.BaseSerializer2.基本序列化类Serializer,继承于BaseSerializerfromrest_fram......
  • 序列化和反序列化
    序列化方式说明二进制序列化器:序列化结果人看不懂,但是序列化后体积小soap序列化器:人能看懂,没啥阅读体验,文件体积比较大xml序列化器:可阅读性好,体积中等序列化为......
  • 序列化与反序列化
    参考视频:153、序列化和反序列化哔哩哔哩bilibili序列化版本说明参考地址:(18条消息)序列化版本号(serialVersionUID)是做什么用的鲱鱼罐头配白花蛇草水的博客-CSDN博客seria......
  • CTFSHOW Web259 SoapClient原生类的反序列化
      index.php   看到该题目第一眼,大脑直接一个简单的想法就是通过访问flag.php添加X-Forwarded-For然后POST发送token数据。但!在本题的环境当中,由于使用了Clou......
  • rest_framework:序列化器类
    一.序列化器类序列化就是把数据转换为json在服务端发送到客户端反序列化是客户端法的数据发送到服务端服务端通过反序列化把数据转换为jsonfromrest_frameworkimp......
  • 面试题:Java序列化与反序列化
    目录序列化和反序列化的概念应用场景?序列化实现的方式继承Serializable接口,普通序列化继承Externalizable接口,强制自定义序列化serialVersionUID的作用静态变量不会被序列......