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"
}))