1. 程式人生 > >django rest framework 序列化元件總結

django rest framework 序列化元件總結

序列化元件總結

一.

序列化元件本質上為了實現前後端分離,而進行json序列化的一個元件形式,極大方便了解析資料的作用

二.

所有序列化是基於APIView 解析器實現的,通過內部的多繼承關係方便實現進行資料序列化的實現

使用方式

1.基於APIView 引入  from rest_framework.views import APIView

2.返回的請求用  Response  from rest_framework.response import Response

3.開始進行建立序列化類的方式  from rest_framework import serializers

第一步 建立序列化類

創建出在返回頁面顯示的欄位 ,一對多關係同建立普通欄位一樣,無需特意宣告關係,但需要引入sourse=publish.city

多對多關係需要手動建立一個特定的方法

第二步 建立需要解析的資料類 繼承APIview 方法

建立的方法要遵循rest請求規範

1.獲取需要傳遞的資料

2.將資料傳到序列化類中,返回一個例項化物件

3.通過返回return Response (例項化物件.data)返回給頁面

優化

一.問題

在進行post 請求時,需要不斷建立欄位新增資料,很麻煩

這樣可以優化序列化類,引用serializers.ModelSerializer

同form表單的modelform也一樣,

class META:

model:

fields:

extra_ksargs: 這裡新增關聯欄位用的 字典形式{

'publish':{"write_only":true}

"authors":{"write_only":true}

}

顯示的欄位

 

publish_name = serializers.CharField(max_length=32, read_only=True, source='publish.name')
publish_city = serializers.CharField(max_length=32, read_only=True, source='publish.city')


手動建立的多對多資料

 

檢視優化

即使優化了序列化類,但是發現數據類有很多的程式碼冗餘,於是引入

mixins: from rest_framework.mixins import (
ListModelMixin,
CreateModelMixin,
DestroyModelMixin,
UpdateModelMixin,
RetrieveModelMixin
)

 

繼承的apivies :from rest_framework.generics import GenericAPIView

 

通過建立資料類引用的模組優化程式碼

使用:

1.引入模組

2.建立類時有兩個關鍵欄位 quertset=找到的資料  serializer_class=引用的序列化類的名字

3.返回請求的特殊方式

def get(self,request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self,request, *args, **kwargs):
return self.create(request, *args, **kwargs)

4.urls 這裡需要特定說明 引用 (?P<pk>\d+) 來拼接

 

path("course/",views.BookView.as_view()),
re_path("course/(?P<pk>\d+)/",views.BookFilterView.as_view())

  

 

優化二

但是發現依然有大量程式碼冗餘

於是引入介面邏輯新模組

from rest_framework import generics
通過
generics.ListCreateAPIView 裡面的內建方法省掉了 多餘的def get/post 請求方法,都被封裝的裡面 
但是會發現在查詢 全部資料以及單個數據時候,需要建立兩個資料類,可不可以用一個呢

於是引出最終優化
 

優化三

引入from rest_framework.viewsets import ModelViewSet 模組

這裡更強大,只需要


class BookView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer


就足夠了
但是在urls 裡需要特意說明,,注意 都是引用一個檢視函式喲
re_path("course/$",views.BookView.as_view({
"get":"list",
"post":'create',
})),
re_path("course/(?P<pk>\d+)/",views.BookView.as_view({
'get':'retrieve',
'put':"update",
'delete':"destroy"
}))