• 142.创建序列化类、序列化测试、反序列化测试


    1.创建序列化类

    在这里插入图片描述

    什么是序列化,为什么要序列化?
    当前web api应用中,前端要用到从后台返回的数据来渲染页面的时候,一般都是使用的json类型的数据,因为json类型简单直观便于理解,那么就需要在django框架中,将模型类数据序列化为json。

    1.1 建立模型

    from django.db import models
    
    # Create your models here.
    class Student(models.Model):
        SEX_CHOICES = ((1,'男'),(2,'女'))
        name = models.CharField(max_length=20,verbose_name='姓名')
        age = models.IntegerField(null=True, blank=True, verbose_name='年龄')
        sex = models.IntegerField(choices=SEX_CHOICES,default=1,verbose_name='性别')
            
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    1.2 迁移模型与数据库配置

    数据库配置

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'rest_study',
            'HOST':'127.0.0.1',
            'PORT':'3306',
            'USER':'root',
            'PASSWORD':'root',
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    迁移模型

    python manage.py makemigrations
    python manage.py migrate
    
    • 1
    • 2

    1.3 创建序列化类

    在子应用的目录下,新建app_serializers.py 文件,在其中建立一个对应第一步建立的模型的序列化类:

    from rest_framework import serializers
    from rest_app.models import *
    class StudentSerializer(serializers.ModelSerializer):
        class Meta:
            model = Student
            fields = ['id', 'name', 'age', 'sex'] #或者 ='__all__'
            
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    说明:

    • 继承自serializers.ModelSerializer类
    • 必须实现class Meta
    • model 的值为对应的模型类
    • fields 的值是要序列化的字段,设置为 fields = ‘all’ 则使用所有模型的字段,也可以使用 exclude 指明要排除的字段,例如:exclude = [‘id’] , 通常使用 fields
    • 继承自ModelSerializer类,其实是一种快捷的方式,也可以直接继承serializers.Serializer,手动写字段集以及 create、update方法。ModelSerializer有一个 repr 属性来查看字段集是如何编写的:

    1.4 测试执行模型的方法

    打开django脚本控制台

    python manage.py shell
    
    • 1

    在这里插入图片描述

    2.序列化测试

    2.1 序列化一个模型实例

    >>> from rest_app.models import *  # 导入模型
    >>> stu = Student.objects.get(pk=1)  # 获取id为1的模型实例
    >>> stu_ser = StudentSerializer(stu) # 序列化数据
    >>> data_dict = stu_ser.data # 获取数据
    >>> from rest_framework.renderers import JSONRenderer
    >>> data_join = JSONRenderer().render(data_dict)  # 将字典数据转换为json格式字节串
    >>> data_join
    b'{"id":1,"name":"\xe5\xb0\x8f\xe7\xba\xa2","age":23,"sex":1}'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.2 序列化模型的查询集QuerySet——序列化全部模型实例

    >>> stus = Student.objects.all()
    >>> stus
    [(1)>, (2)>]>
    >>> stu_ser = StudentSerializer(stus,many=True)
    >>> stus
    [(1)>, (2)>]>
    >>> data_dict = stu_ser.data
    >>> data_dict
    [OrderedDict([('id', 1), ('name', '小红'), ('age', 23), ('sex', 1)]), OrderedDict([('id', 2), ('name', '小强'), ('age', 24), ('sex', 1)])]
    >>> data_join = JSONRenderer().render(data_dict) 
    >>> data_join
    b'[{"id":1,"name":"\xe5\xb0\x8f\xe7\xba\xa2","age":23,"sex":1},{"id":2,"name":"\xe5\xb0\x8f\xe5\xbc\xba","age":24,"sex":1}]'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3. 反序列化测试

    # 将json格式的字节串转化为字典
    >>> from rest_framework.parsers import JSONParser
    >>> import io
    >>> stream = io.BytesIO(b'{"name":"lili","age":20,"sex":2}') # 准备json格式的字节串
    >>> stream
    <_io.BytesIO object at 0x000001DD4042AA90>
    >>> data_dict = JSONParser().parse(stream)# 转化为字典 
    >>> data_dict
    {'name': 'lili', 'age': 20, 'sex': 2}
    
    >>> from rest_app.app_serializer import StudentSerializer  
    >>> serializer = StudentSerializer(data=data_dict) # 将字典数据反序列化
    >>> serializer.is_valid()# 必须执行这一步验证,返回True才可以获取后续的validated_data数据和执行save方法
    True
    >>> serializer.validated_data # 得到OrderedDict,会忽略到id属性
    OrderedDict([('name', 'lili'), ('age', 20), ('sex', 2)])
    >>> serializer.save() # 保存到数据库
    (3)>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  • 相关阅读:
    温故而知新:IIR滤波器设计的方法,幅频计算和参数理解
    Python案例:获取music榜单数据,保存自己的music库
    【王道计算机组成原理】第三章 存储系统
    用hutool中的aes解密对微信小程序加密数据解密
    数据结构与算法 | 链表(Linked List)
    基于SSM框架的众筹平台毕业设计源码211755
    2023-mac brew安装python最新版本,遇见的问题和处理方式
    使用 Stable Diffusion Img2Img 生成、放大、模糊和增强
    SpringMVC-CRUD与文件上传、文件下载
    Springboot 实践(14)spring config 配置与运用--手动刷新
  • 原文地址:https://blog.csdn.net/m0_63953077/article/details/128136256