zoukankan      html  css  js  c++  java
  • 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("================= 
     序列化操作")
        ###序列化之后的对象
        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()方法

  • 相关阅读:
    shell去重
    JDBC源码解析
    try catch finally
    URL
    域名与IP地址的联系与区别
    C++stack
    C++vector
    单链表常见面试题(C语言实现)
    数据库limit子句
    strcpy和memcpy的区别
  • 原文地址:https://www.cnblogs.com/alantammm/p/13555394.html
Copyright © 2011-2022 走看看