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