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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM