zoukankan      html  css  js  c++  java
  • DRF框架之serializer序列化

    一、序列化与反序列化

    1.序列化

    概念:将程序中的一个数据结构类型转化为其它格式(字典、json、XML等)。例如:将django中的模型类对象转换为json字符串,这个转换过程称之为序列化

    序列化时机:当需要给前端响应模型数据时,需要将模型数据序列化成前端需要的格式

    2.反序列化

    概念:将其它格式 (字典、json、XML等)转换为程序中的数据,例如:将json字符串转换为django中的模型类对象,这个过程称之为反序列化

    反序列化时机:当需要将用户发送的数据存储到数据库之前,需要使用反序列化

    3.开发Restful接口时

    视图中做的最主要的三件事:

    • 将请求的数据(如:Json格式)转换为模型类对象(反序列化)
    • 操作数据库
    • 将模型类对象转换为响应的数据(如:Json格式)(序列化)

    在视图中需要做的最核心的事:

    • 将数据库数据序列化为前端所需要的格式,并返回
    • 将前端发送的数据反序列化为模型类对象,并保存到数据库中

    二、序列化用法

      上面的概念中我们已经知道了序列化是用于将模型类对象转换为json后返回给前端,序列化的过程中数据库除了会返回一条数据,往往也会返回多条数据,一条数据一般都以模型类对象的方式返回,而多条数据会以查询集来返回,这两种的序列化方式有一些差别

    在此之前,我们需要在对应的子应用下先创建一个名为serializers.py的模块,在该模块下需要引入serializers模块,并创建序列化器类继承serializers.Serializer父类,在序列化器类下面创建与模型类下对应的字段,字段类型需要从serializers模块中引入

    from rest_framework import serializers
    
    
    class ProjectSerializer(serializers.Serializer):
        name = serializers.CharField(max_length=200, label="项目名称", help_text='项目名称')
        leader = serializers.CharField(max_length=50, label="项目负责人", help_text='项目负责人')
        programmer = serializers.CharField(max_length=50, label="开发人员", help_text="开发人员")
        tester = serializers.CharField(max_length=50, label="测试人员", help_text="测试人员")

    1.序列化模型类对象

    在视图类模块下,返回的为模型类对象时,使用步骤如下:

    1. 实例化一个序列化器类,将模型类对象传给instance变量,并返回一个序列化器类对象
    2. 调用序列化器类对象的data属性后传入JsonResponse并return
    obj = Projects.objects.get(id__exact=pk)
    serializer_obj = ProjectSerializer(instance=obj)
    return JsonResponse(serializer_obj.data)

    2.序列化查询集

    在视图类模块下,返回的为查询集时,使用步骤如下:

    1. 实例化一个序列化器类,将模型类对象传给instance变量,并且设置many为True,并返回一个序列化器类对象
    2. 调用序列化器类对象的data属性后传入JsonResponse,设置safe=False,并return
    qs = Projects.objects.all()
    serializer_obj = ProjectSerializer(instance=qs, many=True)
    return JsonResponse(serializer_obj.data, safe=False)

    完整的代码示例如下:

    from django.http import JsonResponse
    from django.views import View
    from django.db.utils import IntegrityError
    from django.db import connection
    from .models import Projects
    from .serializers import ProjectSerializer
    
    
    class ProjectsPage(View):
        '''
        类视图
        '''
    
        def get(self, request, pk=None):
            if pk:
                obj = Projects.objects.filter(id__exact=pk)
                serializer_obj = ProjectSerializer(instance=obj)
                return JsonResponse(serializer_obj.data)
            else:
                qs = Projects.objects.all()
                serializer_obj = ProjectSerializer(instance=qs, many=True)
                return JsonResponse(serializer_obj.data, safe=False)
  • 相关阅读:
    ModernUI教程:使用预定义的页面布局
    ModernUI教程:第一个ModernUI应用(采用项目模板)
    ModernUI教程:第一个ModernUI应用(手动编写)
    ModernUI教程:目录 (完结)
    ScreenOS学习笔记
    子网划分
    Cisco IOS版本命名规则
    ThinkPHP的Auth类认证
    Excel 2007中自定义数字格式前要了解的准则
    float元素的父元素自适应高度
  • 原文地址:https://www.cnblogs.com/xiaogongjin/p/13283275.html
Copyright © 2011-2022 走看看