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 importserializers
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 importserializers
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方法,實現序列化
-在序列化類中:
defcreate(self, validated_data):
ret=models.book.objects.create(**validated_data)
return ret
-在檢視中:
defpost(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
defvalidate_name(self,value):
(value)
#raise exceptions.validationerror('不能以sb開頭')
if value.startswith('sb'
):
raise validationerror('
不能以sb開頭')
return
value
defvalidate(self,attrs):
(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...