Django之serializer初始-序列化

序列化与反序列化
  1. 序列化
    概念:把对象转换为字节序列的过程称为对象的序列化,通俗来讲:将程序中的一个数据结构类型转化为其它格式,如:将django中的模型类对象转换为json字符串,这个转换过程称之为序列化,场景:当需要给前端返回模型数据时,需要将模型数据进行序列化成需要的格式(数据的输出)

  2. 反序列化
    概念:把字节序列恢复为对象的过程称为对象的反序列化,例如:将json字符串转换为django中的模型类对象,这个过程称之为反序列化,场景:当需要将用户请求的数据存储到数据库时,需要使用反序列化(数据的输入)

序列化用法
  1. 初始化序列化器类
    在使用序列化前,我们需要在对应的子应用下先创建一个名为serializers.py的模块,在该模块下需要引入serializers模块,并创建序列化器类继承serializers.Serializer父类,在序列化器类下面创建与模型类下对应的字段,字段类型需要从serializers模块中引入,注意序列化器类的类属性名必须和数据模型类的类型一致
    下面展示一些 内联代码片
from rest_framework import serializers
from .models import Project
class ProjectsSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=10, label='项目名称', help_text='项目名称帮助文档')
    leader = serializers.CharField(max_length=200, label='项目负责人', help_text='项目负责人帮助文档')
    tester = serializers.CharField(max_length=200, label='测试人员', help_text='测试人员帮助文档')
  1. 序列化模型类对象和查询集
    上面的介绍了序列化是用于将模型类对象转换为某种格式(json)后返回给前端,序列化的过程中除了会返回一条数据,也会返回多条数据,一条数据一般都以模型类对象的方式返回,而多条数据会以查询集来返回
    1. 序列化查询集:在视图类中实例化一个序列化器类,将模型类对象传给instance变量,并且设置many为True,并返回一个序列化器类对象
        qs = Project.objects.all()

        ser_obj = ProjectsSerializer(instance=qs, many=True)
        return JsonResponse(ser_obj.data, status=200, safe=False)
2. 序列化模型类对象:在视图类中实例化一个序列化器类,将模型类对象传给instance变量,并返回一个序列化器类对象,调用序列化器类对象的data属性后传入JsonResponse并return
from django.http import HttpResponse, JsonResponse
from django.views import View
import json
from projects.serializers import ProjectsSerializer
from .models import Project


class IndexPageDetailView(View):

    def get(self, request, pk):
        """
        get请求,获取某一条数据
        :param request:
        :param pk:传入数据的id值
        :return:
        """
        try:
            obj = Project.objects.get(id=pk)
        except Exception as e:
            result = {
                "msg": "参数有误",
                "code": 0
            }
            return JsonResponse(result, status=400)

        ser_obj = ProjectsSerializer(instance=obj)

        python_dict = ser_obj.data

        return JsonResponse(python_dict)
反序列化用法
  1. 初始化序列化器类
    反序列化主要是做数据校验,包括字段类型校验、长度、唯一、只输入、只输出、是否允许为空、是否允许null等等,也可以做自定义的校验,下面是对常用参数的解释
  • max_length:最大长度:在反序列化时进行输入最大长度校验

  • min_lenght:最小长度:在反序列化时进行输入最小长度校验

  • allow_blank:是否允许为空:在反序列化时允许传空白字符串,默认不允许

  • trim_whitespace:是否截断左右空白字符,默认True

  • max_value:最大值:在反序列化时进行输入最大值校验

  • min_value:最小值:在反序列化时进行输入最小值校验

  • read_only:表明该字段仅用于序列化输出,但在反序列化验证时不做校验,默认False

  • write_only:表明该字段仅用于反序列化输入,但在序列化时不进行输出,默认False

  • required:表明该字段在反序列化时必须输入,序列化时必须输出,默认True

  • default:反序列化时使用的默认值,如果不指明,在传递时默认值为0

  • allow_null:表明该字段是否允许传入None,默认False

  • validators:该字段使用的验证器

  • error_messages:包含错误编号与错误信息的字典

  • label:用于HTML展示API页面时,显示的字段名称,相当于模型类字段的verbose_name属性

  • help_text:用于HTML展示API页面时,显示的字段帮助提示信息

创建序列化器对象

  • a.把前端传递的json格式参数转化为字典后,传递给data参数
  • b.调用序列化器对象.is_valid()方法,会开始进行校验,如果没有调用该方法则不校验
  • c.如果校验成功,返回True,否则返回False
  • d.必须调用is_valid()方法之后,返回了False才能调用序列化器对象.errors属性获取相应的报错信息,报错信息返回一个字典
  • e.必须调用is_valid()方法之后,返回了True才能调用序列化器对象.validated_data属性获取校验通过的信息,通过的信息返回一个字典
  • f.报错信息也可以通过给is_valid()方法将它的raise_exception属性设置为True,来主动抛出异常信息

from django.http import JsonResponse
from django.views import View
import json
from .models import Project
from .serializers import ProjectsSerializer


class ProjectsPage(View):
    '''
    类视图
    '''
    def post(self, request):

        input_data = json.loads(request.body)

        serializer_check_obj = ProjectsSerializer(data=input_data)

        if not serializer_check_obj.is_valid():
            return JsonResponse({"code": 1, "res": "error", "msg": serializer_check_obj.errors})

        obj = Project.objects.create(**input_data)

        serializer_obj = ProjectsSerializer(instance=obj)

        return JsonResponse(serializer_obj.data, status=201)

我们在serializer序列化器类中设置name字段值最大为5

name = serializers.CharField(max_length=5, label='项目名称', help_text='项目名称帮助文档',

使用postman调用该接口,验证是否进行了name字段的长度校验
Django之serializer初始-序列化_第1张图片
验证成功了,但是这种异常提示都是DRF框架自己设定的,也可以进行自定义,在序列化器类对应的字段类中,设置error_messages属性,该属性的值需要传一个字典,key设定为你需要自定义异常信息的校验项,值为自定义异常信息

    tester = serializers.CharField(max_length=5, label='测试人员', help_text='测试人员帮助文档', write_only=True,
                                   error_messages={"required": "tester该字段必传", "max_length": "长度不能操作5个字节"})

重启项目,再次调用接口

Django之serializer初始-序列化_第2张图片
友情提示:

1.一定要先执行.is_valid()方法后才能访问.errors和.validated_data

2.可以不用调用.is_valid()方法就能访问.data

你可能感兴趣的:(python,django,json,restful)