Djangorestframework之序列化元件

2022-05-15 15:54:31 字數 4765 閱讀 2618

django自帶序列化元件

這是原生的django序列化元件 但是因為只能對所有的內容進行序列化 ,拓展性太差,所以我們基本啟棄用

drf序列化的兩種方式

第一種:serializers

1 新建乙個序列化類繼承serializer

2 在類中寫要序列化的字段

在檢視中使用序列化的類

1 例項化序列化的類產生物件,在產生物件的時候,傳入需要序列化的物件(queryset)

2 物件.data

3 return response(物件.data)

高階用法:

source:可以指定字段(name publish.name),可以指定方法,

serializermethodfield搭配方法使用(get_欄位名字)

publish_detail=serializers.serializermethodfield(read_only=true)

def get_publish_detail(self,obj):

return

read_only:反序列化時,不傳

write_only:序列化時,不顯示

from rest_framework import

serializers

class

authorserializer(serializers.serializer):

name=serializers.charfield()

age=serializers.charfield()

class

bookserializer(serializers.serializer):

##指定source='name' ,表示序列化模型表中的name欄位,重名命為name5(name和source='name'指定的name不能重名)

name5=serializers.charfield(source='

name')

##write_only 序列化的時候,該字段不顯示

##read_only 反序列化的時候,該欄位不傳

price=serializers.charfield(write_only=true)

##如果要取 出版社的city source='publish.city'

publish=serializers.charfield(source='

publish.name')

##source不但可以指定乙個字段,還可以指定乙個方法

#book_type = serializers.charfield(source='get_xx_display',read_only=true)

##序列化出版社的詳情,指定serializermethodfield之後,可以對應乙個方法,返回什麼內容,publish_detail就是什麼內容

publish_detail=serializers.serializermethodfield(read_only=true)

##對應的方法固定寫法get_欄位名

defget_publish_detail(self,obj):

#print(type(obj))

return ##

#返回所有作者資訊

authors=serializers.serializermethodfield(read_only=true)

defget_authors(self,obj):

#return [ for author in obj.authors.all()]

authorser=authorserializer(obj.authors.all(),many=true)

return

authorser.data

defcreate(self, validated_data):

ret=models.book.objects.create(**validated_data)

return ret

第二種:modelserialzers

繼承該類就指定了表模型

class meta:

model=表模型

1要顯示的字段

fields='__all__'

fields=('id','name')(注釋:列表元組均可以)

2要排除的字段

exclude=('name')

3深度控制

depth=1

4重寫某個字段

在meta外部,重寫某些字段,方式同serializers

from rest_framework import

serializers

class

authorserializer(serializers.serializer):

name=serializers.charfield()

age=serializers.charfield()

from rest_framework import

serializers

from rest_framework import

exceptions

from rest_framework.exceptions import

validationerror

models

class

bookserializer(serializers.modelserializer):

class

meta:

model=models.book

#fields=('nid','name')

#不能跟fields同時使用

#exclude=['name',]

fields=('

__all__')

#深度是1,官方建議不要超過10,個人建議不要超過3

#depth=1

xx=serializers.charfield(source='

get_xx_display')

authors=serializers.serializermethodfield()

defget_authors(self,obj):

ret=authorserializer(instance=obj.authors.all(),many=true)

return

ret.data

name=serializers.charfield()

#反序列化的校驗(區域性校驗,全域性校驗)

def validate_name(self,value):

反序列化

-使用繼承了serializers序列化類的物件,反序列化

-在自己寫的序列化類中重寫create方法

-重寫create方法,實現序列化

-在序列化類中:

def

create(self, validated_data):

ret=models.book.objects.create(**validated_data)

return ret

-在檢視中:

def

post(self,request):

bookser=bookserializer(data=request.data)

ifbookser.is_valid():

ret=bookser.create(bookser.validated_data)

return response()

反序列化的校驗

validate_欄位名(self,value):

如果校驗失敗,丟擲validationerror(丟擲的異常資訊需要去bookser.errors中取)

如果校驗通過直接return value

validate(self,attrs)

attrs所有校驗通過的資料,是個字典

如果校驗失敗,丟擲validationerror

如果校驗通過直接return attrs

def

validate_name(self,value):

print

(value)

#raise exceptions.validationerror('不能以sb開頭')

if value.startswith('sb'

):

raise validationerror('

不能以sb開頭')

return

value

defvalidate(self,attrs):

print

(attrs)

#if attrs.get('price')!=attrs.get('xx'):

#raise exceptions.validationerror('name和price相等,不正常')

return attrs

序列化(序列化)

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

MapReducer糾錯之序列化反序列化問題

在mapreducer程式設計中經常會出現序列化反序列化的說法 在這裡解釋一下 序列化 序列化的意思就是把記憶體中的物件變成位元組儲存到磁碟上 反序列化 反序列化的意思就是把磁碟上的物件活化到記憶體中 說到這裡也許還是沒有說清楚序列化的意思,在大資料中,假設有乙個非常大的集群,也就是很多計算機,這一...

Py t hon之csv,ini 序列化,反序列化

1.csv檔案簡介 csv是乙個被行分隔符,列分隔符劃分成行和列的文字 csv不指定字元編碼 行分隔符為 r n,最後一行可以沒有換行符 列分隔符常為逗號和製表符 每一行稱之為record from pathlib import path p path test.csv csv body id,na...