Django序列化1_基本的序列化和反序列化
Serializer(instance, data, **kwarg)构造方法:
(1)用于序列化时,将模型类对象传入instance参数
(2)用于反序列化时,将要被反序列化的数据传入data参数
(3)除了instance和data参数外,在构造Serializer对象时,还可通过context参数额外 添加数据。例如:serializer
=
AccountSerializer(account, context
=
{
'request'
: request}),通过context参数附加的数据,可以通过Serializer对象的context属性获取。
comment=Comment(email='799165587@qq.com',content='测试的文字内容',number=2)#这三个参数是事先声明好的 ser = CommentSerializers(comment,context={'request':'请求的内容'})#通过context添加额外的数据 print(ser.data)#{'email': '799165587@qq.com', 'content': '测试的文字内容', 'number': 2} print(ser.context.get('request'))#请求的内容 print(ser)#CommentSerializers(<__main__.Comment object>, context={'request': '请求的内容'}):
1.序列化
import datetime from rest_framework import serializers from django.conf import settings settings.configure() from rest_framework.renderers import JSONRenderer import json import io from rest_framework.parsers import JSONParser class Comment(object): def __init__(self,email,content,created=None): self.email = email self.content = content # self.created = created or datetime.datetime.now() comment=Comment(email='799165587@qq.com',content='测试的文字内容') class CommentSerializers(serializers.Serializer): email = serializers.EmailField() content = serializers.CharField(max_length=50) # created = serializers.DateTimeField() if __name__ == '__main__': #序列化操作 print("================= \n 序列化操作") ###序列化之后的对象 ser_1 = CommentSerializers(comment) print('ser_1 type为:',type(ser_1),' 值为:',ser_1) #返回的是CommentSerializers对象 ###序列化后的data print('ser_1.data type为:',type(ser_1.data),' 值为:',ser_1.data)#返回的是rest的字典类型 rest_framework.utils.serializer_helpers.ReturnDict ###序列化后的data转换成成品json 格式 bytes ser_1_json = JSONRenderer().render(ser_1.data) #返回的是bytes # ser_1_json = json.dumps(ser_1.data) #返回的是str print('ser1_json type为:',type(ser_1_json),' 值为:',ser_1_json)
2.反序列化
1.待处理数据转换为json格式
比如一个流 这里为了验证过程 多添加了转换成流这一步(实际过程中没有这个多此一举的行为)
import io from rest_framework.parsers import JSONParser #接上图的代码 ser_1_json = io.BytesIO(ser_1_json) #<class '_io.BytesIO'> ser_1_json = JSONParser().parse(ser_1_json) # <class 'dict'>
2.转换为序列化对象,然后is_valid() 和 validated_data 生成python的原生数据类型
依然是调用CommentSerializer类的构造函数,但是给data参数传递数据,而不是第一位置参数,这表示反序列化过程。其次,数据有一个验证过程is_valid(),必须先is_valid()才能调用
valiadated()方法
这个步骤做完,只是从json变成了原生的Python数据类型,还不是前面自定义的Comment类的对象
re_ser1 = CommentSerializers(data=ser_1_json) #CommentSerializers对象 print(re_ser1.is_valid) #True print(re_ser1.validated_data)#OrderedDict([('email', '799165587@qq.com'), ('content', '测试的文字内容')])
3.保存实例
如果我们想要返回基于验证数据的完整对象实例,我们需要实现.create()
或者update()
方法
class CommentSerializer(serializers.Serializer): email = serializers.EmailField() content = serializers.CharField(max_length=200) created = serializers.DateTimeField() def create(self, validated_data): return Comment(**validated_data) def update(self, instance, validated_data): instance.email = validated_data.get('email', instance.email) instance.content = validated_data.get('content', instance.content) instance.created = validated_data.get('created', instance.created) return instance
create、update两个方法都是从BaseSerializer类中继承过来的,create表示新增一个数据,update表示更新一个数据。由于validated_data是一个OrderedDic类型,所以调用字典.get(key,value)方法来
更新实例(ps: dic.get(key,default=None)) instance 参数指的是 Serializer实例(type为:CommentSerializers)
- key -- 字典中要查找的键。
- default -- 如果指定键的值不存在时,返回该默认值。
这里的update返回的是一个新的实例,如果要保存更新到该实例,需要用到save()方法