序列化器的理解

  其實就是Django RESTful Framework前端

RESTful一種API的命名風格,主要由於先後端分離開發出現python

先後端分離: 用戶訪問靜態文件的服務器,數據所有由ajax請求給到ajax

RESTful風格:數據應該是名詞,而動詞由HTTP的請求方式來體現django

RESTful風格的API給前端返回 結果對象,不管什麼請求方式json

」’ 特色: 反覆重複 
由於不論什麼請求方式,都須要給前端返回對象內容,就是json格式的 
因此每次若是有查詢的結果對象都須要遍歷成字典,和flask相同flask

若是不是get請求是帶有內容的請求,那從前端接收的是json格式 
每次都須要從request.body中拿出內容,是bytes格式 
而後decode解碼成json字符串而後再loads成能夠給python處理的字典 
」’後端

」’ 
說明: 
return JsonResponse(book_list, safe=False)api

對safe的說明,咱們傳過去的book_list是一個list格式安全

在前端json支持{}格式也支持[]格式服務器

可是django中認爲[]的json格式是不安全的會進行校驗

因此把safe選項關閉False,不進行校驗就能夠傳[]

」’

」’ 
序列化:對查詢結果進行遍歷,而後轉成字典,給到JsonResponse 
反序列化:接收前端json處理成字典,而後校驗 
」’

」’ 
1.DRF框架工程搭建,創建在django的基礎上 
安裝DRF: pip install djangorestframework 
註冊DRF: INSTALLED_APPS = [‘rest_framework’,] 
在子應用中serializers.py建立序列化器,用於執行序列化和反序列化 
在views中類視圖使用序列化器,在urls中寫地址 
」’

」’ 
2.序列化器: serializer

定義: 其實ModelSerializer是Serializer的子類,更方便有模型類的序列化器的建立,實際產生的序列化器以下 
class BookInfoSerializer(serializers.Serializer): 實際繼承Serializer 
「」「圖書數據序列化器」「」 序列化器:執行序列化和反序列化 
id = serializers.IntegerField(label=’ID’, read_only=True) read_only:只在輸出響應中使用,就是給前端的時候,而前端給咱們傳請求的時候,不作驗證 
btitle = serializers.CharField(label=’名稱’, max_length=20) 
bpub_date = serializers.DateField(label=’發佈日期’, required=False) 
bread = serializers.IntegerField(label=’閱讀量’, required=False) 
bcomment = serializers.IntegerField(label=’評論量’, required=False) 
image = serializers.ImageField(label=’圖片’, required=False)

字段 : 跟模型類建立很類似,具體存在的字段見講義 還有經常使用的參數(就是約束)

使用: 建立對象 serializer = Serializer(instance=None, data=empty, **kwarg) 
說明: 序列化時,將模型類對象傳入instance參數 instance = 序列化對象 
反序列化時,將要被反序列化的數據傳入data參數 data = 反序列化對象 
可經過context參數額外添加數據 即 **kwarg : context={‘request’: request} 經過Serializer對象的context屬性獲取 
」’

」’ 
3.序列化操做 : 其實就是查詢到對象以後,遍歷構造字典的過程,而JsonResponse由內置的 Renderer渲染器來執行

3-1.序列化只使用序列化器對象的第一個參數instance 
serializer = BookInfoSerializer(instance = book) 
經過data屬性能夠獲取序列化後的數據,這個data跟第二個參數可不是一個 
serializer.data

{‘id’: 2, ‘btitle’: ‘天龍八部’, ‘bpub_date’: ‘1986-07-24’, ‘bread’: 36, ‘bcomment’: 40, ‘image’: None}

3-2.若是要被序列化的是包含多條數據的查詢集QuerySet,添加many=True參數 
book_qs = BookInfo.objects.all() 
serializer = BookInfoSerializer(book_qs, many=True) 
serializer.data 
」’

」’ 
4.關聯對象嵌套序列化(由hero->book經過 hbook方法)

4-1.hbook是個外鍵: PrimaryKeyRelatedField 
hbook = serializers.PrimaryKeyRelatedField(label=’圖書’, read_only=True) 
由於是外鍵,第二個位置必須有read_only=True 或者 查詢集 queryset=BookInfo.objects.all() 要不報錯 
serializer.data 序列化的時候 結果是 關聯對象的主鍵 {‘hbook’: 2} 即 book.id

4-2.由於id不直觀,想要詳細內容的字符串,把外鍵字段改成 : StringRelatedField 
hbook = serializers.StringRelatedField(label=’圖書’) 
結果: {‘hbook’: ‘天龍八部’}

4-3.接口連接: HyperlinkedRelatedField 
hbook = serializers.HyperlinkedRelatedField(label=’圖書’, read_only=True, view_name=’books-detail’) 
必須指明view_name參數,以便DRF根據視圖名稱尋找路由,進而拼接成完整URL 這個view_name傳什麼:url中有1個參數,是命名空間,是跟它關聯 
結果: {‘hbook’: ‘http://127.0.0.1:8000/books/2/‘}

4-4.關聯對象的指定字段數據 : SlugRelatedField 
hbook = serializers.SlugRelatedField(label=’圖書’, read_only=True, slug_field=’bpub_date’) 
slug_field指明使用關聯對象的哪一個字段 
結果:{‘hbook’: datetime.date(1986, 7, 24)}

4-5.使用關聯對象的序列化器: 直接把所屬book的全部內容序列化 hbook = BookInfoSerializer() 結果:{‘hbook’: OrderedDict([(‘id’, 2), (‘btitle’, ‘天龍八部’)te’, ‘1986-07-24’), (‘bread’, 36), (‘bcomment’, 40), (‘image’, None)])}

相關文章
相關標籤/搜索