序列化器使用

2021-08-21 01:32:43 字數 3801 閱讀 6358

django課程講義

序列化使用

我們在django shell中來學習序列化器的使用。

python manage.py shell

1 基本使用

1) 先查詢出乙個圖書物件

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', 2), ('btitle', '天龍八部'), ('bpub_date', '1986-07-24'), ('bread', 36), ('bcomment', 40), ('image', n]), ordereddict([('id', 3), ('btitle', '笑傲江湖'), ('bpub_date', '1995-12-24'), ('bread', 20), ('bcomment', 80), ('image'ne)]), ordereddict([('id', 4), ('btitle', '雪山飛狐'), ('bpub_date', '1987-11-11'), ('bread', 58), ('bcomment', 24), ('ima none)]), ordereddict([('id', 5), ('btitle', '西遊記'), ('bpub_date', '1988-01-01'), ('bread', 10), ('bcomment', 10), ('im', 'booktest/xiyouji.png')])]

2 關聯物件巢狀序列化

如果需要序列化的資料中包含有其他關聯物件,則對關聯物件資料的序列化需要指明。

例如,在定義英雄資料的序列化器時,外來鍵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)

或hbook = serializers.primarykeyrelatedfield(label='圖書', queryset=bookinfo.objects.all())

指明欄位時需要包含read_only=true或者queryset引數:

包含read_only=true引數時,該字段將不能用作反序列化使用

包含queryset引數時,將被用作反序列化時引數校驗使用

使用效果:

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)slugrelatedfield

此字段將被序列化為關聯物件的指定字段資料

hbook = serializers.slugrelatedfield(label='圖書', read_only=true, slug_field='bpub_date')

slug_field指明使用關聯物件的哪個字段

使用效果

4)使用關聯物件的序列化器

hbook = bookinfoserializer()

使用效果

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)

image = serializers.imagefield(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

# {'id': 2, 'btitle': '天龍八部', 'bpub_date': '1986-07-24', 'bread': 36, 'bcomment': 40, 'image':

序列化使用

序列化使用 我們在django shell中來學習序列化器的使用。在pycharm tool windows terminal 命令 python manage.py shell class bookinfo models.model 圖書模型 btitle models.charfield max...

序列化(序列化)

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

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

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