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()方法

posted @ 2020-08-24 18:08  Alantammm  阅读(719)  评论(0编辑  收藏  举报