drf序列化元件

2022-05-15 16:07:16 字數 2876 閱讀 1176

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的類)

def

validate_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...