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 迁移模型与数据库配置

数据库配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'rest_study',
        'HOST':'127.0.0.1',
        'PORT':'3306',
        'USER':'root',
        'PASSWORD':'root',
    }
}

迁移模型

python manage.py makemigrations
python manage.py migrate

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__'
        

说明:

  • 继承自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

在这里插入图片描述

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}'

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

>>> stus = Student.objects.all()
>>> stus
<QuerySet [<Student: Student object (1)>, <Student: Student object (2)>]>
>>> stu_ser = StudentSerializer(stus,many=True)
>>> stus
<QuerySet [<Student: Student object (1)>, <Student: Student object (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}]'

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() # 保存到数据库
<Student: Student object (3)>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想成为数据分析师的开发工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值