序列化使用

2021-08-27 16:07:04 字數 4366 閱讀 9696

序列化使用

我們在django shell中來學習序列化器的使用。在pycharm tool windows -> terminal  命令 python manage.py shell

class bookinfo(models.model):  # 圖書模型

btitle = models.charfield(max_length=20, verbose_name='書名')

bpub_date = models.datefield(verbose_name='日期')

bread = models.integerfield(default=0, verbose_name='閱讀量')

is_delete = models.booleanfield(default=false, verbose_name='邏輯刪除')

class meta:

db_table = 'tb_books'  # 指定表名

verbose_name = '圖書'

verbose_name_plural = verbose_name

1 基本使用

1) 先查詢出乙個圖書物件 booktest: djando子應用,models:模型

from booktest.models import bookinfo

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

2) 構造序列化器物件

from booktest.serializers import bookinfoserializer

serializer = bookinfoserializer(book)

3)獲取序列化資料

通過data屬性可以獲取序列化後的資料

serializer.data   --> 

4)如果要被序列化的是包含多條資料的查詢集queryset,可以通過新增many=true引數補充說明

book_qs = bookinfo.objects.all()

serializer = bookinfoserializer(book_qs, many=true)

serializer.data  --> # [ordereddict([('id', 1), ('btitle', '天龍八部'), ('bpub_date', '1986-07-24'), ('bread', 36), ('bcomment', 40)]), ordereddict([('id', 2), ('btitle', '笑傲江湖'), ('bpub_date', '1995-12-24'), ('bread', 20), ('bcomment', 80)])..... ]

2 關聯物件巢狀序列化

class heroinfo(models.model):  # 英雄模型

gender_choices = (

(0, 'male'),

(1, 'female')

)hname = models.charfield(max_length=20, verbose_name='名稱')

hgender = models.smallintegerfield(choices=gender_choices, default=0, verbose_name='性別')

hcomment = models.charfield(max_length=200, null=true, verbose_name='描述資訊')

hbook = models.foreignkey(bookinfo, on_delete=models.cascade, verbose_name='圖書')  # 外來鍵

is_delete = models.booleanfield(default=false, verbose_name='邏輯刪除')

class meta:

db_table = 'tb_heros'  # 指定表名

verbose_name = '英雄'  # admin後端展示

verbose_name_plural = verbose_name

如果需要序列化的資料中包含有其他關聯物件,則對關聯物件資料的序列化需要指明。例如,在定義英雄資料的序列化器時,外來鍵hbook(即所屬的圖書)字段如何序列化?

我們先定義heroinfoserialzier除外鍵字段外的其他部分

class heroinfoserializer(serializers.serializer):

"""英雄資料序列化器"""

gender_choices = (

(0, 'male'),

(1, 'female')

)id = serializers.integerfield(label='id', read_only=true)

hname = serializers.charfield(label='名字', max_length=20)

hgender = serializers.choicefield(choices=gender_choices, label='性別', required=false)

hcomment = serializers.charfield(label='描述資訊', max_length=200, required=false, allow_null=true)

對於關聯字段,可以採用以下幾種方式:

1) primarykeyrelatedfield

此字段將被序列化為關聯物件的主鍵。hbook = serializers.primarykeyrelatedfield(label='圖書', read_only=true)

指明欄位時需要包含read_only=true:* 包含read_only=true引數時,該字段將不能用作反序列化使用

from booktest.serializers import heroinfoserializer

from booktest.models import heroinfo

hero = heroinfo.objects.get(id=6)

serializer = heroinfoserializer(hero)

serializer.data

使用效果:  #

2) stringrelatedfield

此字段將被序列化為關聯物件的字串表示方式(即__str__方法的返回值)hbook = serializers.stringrelatedfield(label='圖書')

使用效果: 

3)使用關聯物件的序列化器hbook = bookinfoserializer()

使用效果: 

3 many引數

如果關聯的物件資料不是只有乙個,而是包含多個資料,如想序列化圖書bookinfo資料,每個bookinfo物件關聯的英雄heroinfo物件可能有多個,此時關聯字段型別的指明仍可使用上述幾種方式,只是在宣告關聯欄位時,多補充乙個many=true引數即可。

此處僅拿primarykeyrelatedfield型別來舉例,其他相同。在bookinfoserializer中新增關聯字段:

class bookinfoserializer(serializers.serializer):

"""圖書資料序列化器"""

id = serializers.integerfield(label='id', read_only=true)

btitle = serializers.charfield(label='名稱', max_length=20)

bpub_date = serializers.datefield(label='發布日期', required=false)

bread = serializers.integerfield(label='閱讀量', required=false)

heroinfo_set = serializers.primarykeyrelatedfield(read_only=true, many=true)  # 新增

from

booktest.serializers

import

bookinfoserializer

from

booktest.models

import

bookinfo

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

serializer = bookinfoserializer(book)

serializer.data

使用效果:

序列化(序列化)

原書上翻譯為序列化,msdn翻譯為序列化 作用 當需要儲存,或者網路傳輸 remoting時,資料 物件或值 需要序列化 類似於打包傳輸檔案。system.serializableattribute 序列化是指儲存和獲取磁碟檔案 記憶體或其他地方中的物件。在序列化時,所有的例項資料都儲存到儲存介質上...

序列化(模型序列化 序列化巢狀)

from rest framework import serializers from meituan.models import merchant,class merchantserializer serializers.modelserializer class meta model merch...

序列化和解序列化

serialize 返回乙個字串,包含著可以儲存於 php 的任何值的位元組流表示。unserialize 可以用此字串來重建原始的變數值。用序列化來儲存物件可以儲存物件中的所有變數。物件中的函式不會被儲存,只有類的名稱。要能夠unserialize 乙個物件,需要定義該物件的類。也就是,如果序列化...