什么是序列化,为什么要序列化?
当前web api应用中,前端要用到从后台返回的数据来渲染页面的时候,一般都是使用的json类型的数据,因为json类型简单直观便于理解,那么就需要在django框架中,将模型类数据序列化为json。
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='性别')
数据库配置
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
在子应用的目录下,新建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__'
说明:
打开django脚本控制台
python manage.py shell
在这里插入图片描述
>>> 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}'
>>> 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}]'
# 将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)>