Django序列化1_基本的序列化和反序列化
阿新 • • 發佈:2020-08-24
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()方法