1. 程式人生 > 實用技巧 >Django序列化1_基本的序列化和反序列化

Django序列化1_基本的序列化和反序列化

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='[email protected]',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', '[email protected]'), ('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()方法