Serializer序列化和反序列化的基礎使用方法

2021-10-23 15:28:59 字數 3297 閱讀 3584

序列化定義:

序列化器的作用:

封裝了序列化操作

封裝了反序列化操作

反序列化使用

序列化流程:

模型類物件 ——> 字典 ——> json格式字串

1)獲取目標資料(乙個或者多個模型類物件)

# 單一目標資料

book = bookinfo.objects.get(pk=2)

# 多個目標資料

books = bookinfo.objects.

all(

)

2)例項化序列化器物件(通過instance引數傳入目標資料,通過many=true引數來確定目標資料是否是多個,true代表多個,預設為false表示乙個)

# 單一資料

bs = bookinfoserializer(instance=book)

# 多個資料

bs = bookinfoserializer(instance=books, many=

true

)

3)通過序列化器的data屬性獲取序列化裡的結果

bs.data

'''單一結果,獲取結果為字典(dict)格式資料,包括欄位和值,

如:多個結果,獲取結果為列表(list),裡面包含多個有序字典(ordereddict),

如:[ordereddict(),ordereddict()...]

'''

1)序列化為主鍵

2)序列化為__str__方法返回的結果

3)自定義序列化

關聯巢狀序列化有兩個方向

(1)序列化從表物件,巢狀序列化與之關聯的乙個主表物件

如下圖**中,從表heroinfo的字段hbook代表關聯的單一主表物件

class

herinfoserializer

(serializers.serializer)

:# 關聯物件字段序列化方式

# (1)主鍵序列化

hbook = serializer.primarykeyrelatedfield(read_only=

true

)# (2)序列化為關聯物件__str__方法返回的結果

hbook = serializer.stringrelatedfield(

)# (3)自定義序列化

hbook = bookinfoserializer(

)

(1)序列化**主表物件**,巢狀序列化與之關聯的**多個從表物件**

from django.db import models

# 定義圖書模型類bookinfo

class

bookinfo

(models,model)

:# 略...

# 預設情況下:heroinfo_set --規律--> 從表模型類小明_set

# 從表通過設定related_name來自定義隱藏欄位heros代表當前書本物件關聯的多個從表英雄物件

class

heroinfo

(models.model)

:# 略...

# heroinfo物件.hbook --> 關聯的bookinfo單一物件

# 從表中外鍵關聯字段榆樹條件related_name定義主表模型類隱藏字段(該主表隱藏字段代表從表多條資料)

hbook = models.foreignkey(bookinfo, related_name=

'heros'

,on_delete=models.cascade,

verboser_name=

'圖書'

)# 外來鍵

# 略...

def__str__

(self)

:return self.hname

如下圖**中,主表bookinfo的字段heros代表關聯的多個從表物件

class

bookinfoserializer

(serializers.serializer)

:# heros隱藏字段,代表heroinfo模型類「多個」物件

heros = serializers.primarykeyrelatedfield(read_only=

true

, many=

true

) heros = serializers.stringrelatedfield(many=

true

) heros = newheroinfoserializer(many=

true

)

反序列化流程:

json字串 ——> 字典 ——> 校驗 ——> 新建/更新

獲取被校驗的前端傳值(字典)

book_info =

例項化序列化器物件(通過data引數傳入被校驗的原始資料)

bs = bookinfoserializer(data=book_info)
啟動校驗流程

# 返回值true或者false,來表示成功

bs.is_valid(

)# 校驗失敗,將會以丟擲異常validationerror的形式,表示校驗失敗

bs.is_valid(raise_exception=

true

)

判斷校驗成功與否

(1)當且僅當校驗成功,才會生成有效資料

# 獲取有效資料

bs.validated_data

(2)如果失敗檢視錯誤提供資訊

bs.errors

使用required=true來設定當前欄位必傳,required=false表示可傳可不傳

python marshal 物件序列化和反序列化

有時候,要把記憶體中的乙個物件持久化儲存到磁碟上,或者序列化成二進位制流通過網路傳送到遠端主機上。python中有很多模組提供了序列化與反序列化的功能,如 marshal,pickle,cpickle等等。今天就講講marshal模組。注意 marshal並不是乙個通用的模組,在某些時候它是乙個不被...

序列化和反序列化

先定義乙個類 serializable xmlroot shintech public class person set public string name set public person this 0,string.empty public person int m age,string m...

序列化和反序列化

引文來自 序列化和反序列化我們可能經常會聽到,其實通俗一點的解釋,序列化就是把乙個物件儲存到乙個檔案或資料庫欄位中去,反序列化就是在適當的時候把這個檔案再轉化成原來的物件使用。using system using system.collections using system.text namesp...