1.rest-framework序列化之serializer
rest-framework序列化之serializer步驟1. 建立乙個類,繼承serializer
2. 在類中寫要序列化的字段
'''class bookserializer(serializers.serializer):
# 序列化表中的某幾個字段 固定寫法
nid = serializers.charfield()
name = serializers.charfield()
title = serializers.charfield(source='name')
price = serializers.charfield()
publish = serializers.charfield(source='publish.email')
''' 3. 在view.py中使用
'''# 使用序列化
def get(self, request):
response =
book_list = book.objects.all()
# 實力化bookserializer, 將要實力化的資料傳入(queryset物件)
# 要是用序列化一定要加many=true
book_ser = bookserializer(book_list, many=true)
response['data'] = book_ser.data
return response(response)
'''
2. source的用法
1. 指定字段 2. 指定方法 3.深度查詢(跨表)
3. rest-framework序列化之modelserializer
#繼承modelserializer,可以直接指定要序列化的表模型
1. 寫乙個類, 繼承modelserializer
2. 在類內部寫
class
bookserializer(serializers.modelserializer):
class
meta:
model =models.book
#指定要序列化的字段
#fields=['nid','name']
#__all__顯示全部內容
field ='
__all__'#
篩選(注意,不能跟fields連用)
exclude = ['
name
', '
price']
#深度depth = 1重寫屬性
publish欄位,返回出版社的所有資訊,包括id,name,email。。。。
#serializermethodfield配合乙個方法,方法的返回值會付給publish
publish=serializers.serializermethodfield()
defget_publish(self,obj):
#print(type(obj))
#print(obj)
return
4. 序列化單條資料
book_ser=bookserializer(instance=book,many=false)
5. 反序列化之區域性和全域性鉤子(序列化的類一定是繼承modelserializer的類)
defvalidate_name(self, value):
if value.startswith('sb'
)
raise validationerror('
書名不能以s開頭)
else
:
return
value
#全域性鉤子函式,對全域性字段進行校驗
defvalidate(self,atrr):
#print(atrr)
name=atrr.get('
name')
price=atrr.get('
price')
if name !=price:
raise validationerror('錯了'
)
else
:
return a
6. 原始碼及實現
'''反序列化區域性鉤子函式原始碼:
1. is_valid
2. self.run_validation-(執行serializer的run_validation)
3. self.to_internal_value(data)
4.(執行serializer的run_validation:485行)
many=true時和many=false時,生成的其實不是乙個物件
序列化元件,先呼叫__new__方法,如果many=true,生成listserializer物件,如果為false,生成serializer物件
序列化元件source原始碼部分
序列化物件.data方法--呼叫父類data方法---呼叫物件自己的to_representation(自定義的序列化類無此方法,去父類找)
aerializer類裡有to_representation方法,for迴圈執行attribute = field.get_attribute(instance)
再去field類裡去找get_attribute方法,self.source_attrs就是被切分的source,然後執行get_attribute方法,source_attrs
當引數傳過去,判斷是方法就加括號執行,是屬性就把值取出來
'''
drf序列化元件
restful規範 前後端分離 前端乙個專案,後端乙個專案 1 通常使用https協議 2.網域名稱部署 api.baidu.com www.baidu.com api 3.版本 www.baidu.com api v2 版本號放在請求頭中 4.路徑都是名詞 可以用複數 5.根據不同的請求方式,執行...
drf 序列化器
序列化器 和 django中 的 form 和 modelform 有類似的地方 因為 在 drf 中,沒有模板的概念,所以 序列化的主要作用 是對響應的資料做序列化的,還可以對 接收到的資料做序列化 serializer 序列化 查詢的結果queryset user.objects.all ser...
drf 序列化器
models.pyclass chargepolicydetail models.model purpose c models.apartment.purpose category c models.apartment.category name models.charfield max lengt...