Loading

反序列化(利用字段参数进行数据验证)

反序列化(利用字段参数进行数据验证)

4.1 序列化器

class Student1Serializer1(serializers.Serializer):
    """学生信息序列化器"""

    # 1.转换的字段说明
    # 字段 = serializer.字段类型(选项=选项值)

    id = serializers.IntegerField(read_only=True) # 反序列化阶段不会要求id有值
    name = serializers.CharField(required=True) # 反序列化阶段必填
    sex = serializers.CharField(default="男") # 反序列化阶段如果没填,则使用默认值
    age = serializers.IntegerField(min_value=0,max_value=100,error_messages={
        "min_value":"the age must be age>=100",
        "max_value":"the age must be age<=100"
    }) # error_messages为自定义的错误信息,其实默认的有,也可以不写
    classroom = serializers.CharField(default="310") # 反序列化阶段如果没填,则使用默认值
    info = serializers.CharField(allow_null=True,allow_blank=True) # 允许客户端不填写(None),或者为""

    # 2.如果当前序列化器继承的是Modelserializer,则需要声明需要调用的模型信息
    # class Meta:
    #     model = 模型名
    #     fields = ["数据库字段名1","数据库字段名2","数据库字段名3",....,"数据库字段名n",] 或 "__all__"

    # 3.验证代码的对象方法(钩子函数)
    # def validate(self, attrs):  # validate是固定的
    #     pass
    #     return attrs
    #
    # def validate_<字段名>(self,data): # 方法名必须以validate_<字段名>来命名
    #     psss
    #     return data

    # 4.模型操作方法

    # def create(self, validated_data): # 添加数据后,字典自动变为模型对象
    #     pass
    #
    # def update(self, instance, validated_data): # 更新数据后,字典自动变为模型对象
    #     pass

4.2 视图

import json
from django.views import View
from django.http import JsonResponse
from .serializers import Student1Serializer, Student1Serializer1
from app.models import *


class StudentView(View):
   
    def get3(self, request):
        """反序列化-采用字段选项来验证数据-验证失败不抛出异常"""
        # 1.接收客户端提交的数据
        # data = json.loads(request.body)
        data = {
            "name": "彭于晏",
            "age": 120,
            "sex": "男",
            "classroom": "444",
            "info": "要做个猛男,要猛!"
        }
        # 2.实例化序列化器,获取序列化对象
        serializer = Student1Serializer1(data=data)
        # 3.调用序列化器进行数据验证
        ret = serializer.is_valid()
        # 4.获取验证以后的结果
        if ret:
            return JsonResponse(dict(serializer.validated_data), safe=False)
        else:
            return JsonResponse(dict(serializer.errors), safe=False)
        # 5.操作数据库

        # 6.返回结果

    def get(self, request):
        """反序列化-采用字段选项来验证数据-验证失败抛出异常"""
        # 1.接收客户端提交的数据
        # data = json.loads(request.body)
        data = {
            "name": "张家祥",
            "age": 120,
            "sex": "男",
            "classroom": "444",
            "info": "这个人很胖"
        }
        # 2.实例化序列化器,获取序列化对象
        serializer = Student1Serializer1(data=data)
        # 3.调用序列化器进行数据验证
        ret = serializer.is_valid(raise_exception=True) # 抛出异常,代码不会往下执行
        # 4.获取验证以后的结果
        if ret:
            return JsonResponse(dict(serializer.validated_data), safe=False)
        else:
            return JsonResponse(dict(serializer.errors), safe=False)
        # 5.操作数据库

        # 6.返回结果

4.3 测试

验证失败不抛异常:

客户端数据:

{
      "name": "彭于晏",
      "age": 120,
      "sex": "男",
      "classroom": "444",
      "info": "要做个猛男,要猛!"
}

响应结果:

{
    "age": [
        "the age must be age<=100"
    ]
}

验证失败抛异常:

客户端数据:

{
      "name": "彭于晏",
      "age": 120,
      "sex": "男",
      "classroom": "444",
      "info": "要做个猛男,要猛!"
}

响应结果:

x2o4Fs.png

验证成功:

客户端数据:

{
      "name": "彭于晏",
      "age": 30,
      "sex": "男",
      "classroom": "444",
      "info": "要做个猛男,要猛!"
}

响应结果:

{
    "name": "彭于晏",
    "sex": "男",
    "age": 30,
    "classroom": "444",
    "info": "要做个猛男,要猛!"
}
posted @ 2022-10-24 17:11  minqiliang  阅读(74)  评论(0编辑  收藏  举报
-->