序列化使用
我們在django shell中來學習序列化器的使用。在pycharm tool windows -> terminal 命令 python manage.py shell
1 基本使用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) 先查詢出乙個圖書物件 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 關聯物件巢狀序列化
如果需要序列化的資料中包含有其他關聯物件,則對關聯物件資料的序列化需要指明。例如,在定義英雄資料的序列化器時,外來鍵hbook(即所屬的圖書)字段如何序列化?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
我們先定義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中新增關聯字段:
fromclass 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) # 新增
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 乙個物件,需要定義該物件的類。也就是,如果序列化...