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)>