Django REST Framework中的序列化器類和視圖類

序列化器類

一、Serializer序列化類

Serializer是DRF的序列化器基類,提供基本功能,使用Serializer類需要自己定義字段名稱和類型。

BookSerializer(Serializer):name = serializers.CharField()price = serlializers.IntegerField()date = serlializers.DateField()

Serializer序列化器類初始化的時候的幾個參數說明:
instance這個指從數據庫中讀取的記錄對應的對象,用于顯示或者編輯中的現有
many如果是true,則指傳遞了多個對象
data用于收集通過post傳上來的字典,用于新增或者編輯中的更新
Serializer序列化器提供了一個.save()接口用于保存數據,這個函數里面通過判斷instance是否有值來確定是新增還是更新,如果有值則調用self.update(),如果沒有值則調用self.create(),這兩個方法需要自己實現,以滿足用戶的新增或者修改的邏輯。

self.create(self, validated_data)
self.update(self, instance, validated_data)

實現了這兩個方法后,在客戶類里面需要新增或者保存的時候,只需統一的調用serializer.save()就可以了。

二、ModelSerializer類

使用ModelSerializer類,就不用再自己定義字段名稱和類型了,直接給出模型名稱,指出需要序列化的字段即可。

BookSerializer(ModelSerlizer):class Meta:model	= Bookfields	= [“name”, “date”] # 這里可以自己定義需要的字段,__all__表示所有字段,也可以自己定義字段名稱

使用ModelSerlializer類也不需要再自己定義create()和update()方法了,ModelSerlializer類已經實現了這兩個函數的定義。

視圖類

django里面的視圖實際上是業務邏輯存放的地方,也就是“功能”,并不是頁面樣式。
而業務的功能無非就是這5種:增、刪、改、查(列表)、查(詳情)
DRF里面提供了三大類的類:API、mixin、ViewSet,API類的類提供接口(get、post、put、update、delete),mixin提供功能,ViewSet負責包裝。

一、CBV視圖,基于類的視圖

django的原生視圖是基于函數的,也就是FBV。CBV是基于類的,繼承自View類。View類中有兩個重要的函數:

View.dispatch()
View.as_view()

在View.as_view()函數中,又定義了一個子函數view(),as_view()會返回這個函數。在基于函數(FBV)的視圖模式中,urls.py文件中指向的就是函數,而在基于類的視圖(CBV)中,urls.py文件中指向的是類的as_view()函數,注意這里是加了括號的,就是說是要直接執行這個函數的,而這個函數的執行結果,是里面的子函數vews()。子view()函數會調用View.dispatch()函數,用于通過反射,指向在客戶類中定義的get(),post(),put(),delete()等http方法的函數。
提示:CBV相對于FBV,改變了函數的組織形式,FBV是自己定義函數,通過路徑找到該函數。CBV是統一使用http的method,用過method名稱(get、post、put、update、delete),找到以該名稱定義的函數,實現增刪改查查。這也就是RESTFul。

二、APIView

APIView(View)類中也定義了以下兩個函數:

APIView.dispatch()
APIView.as_view()

其中,as_view()函數調用了csrf_exempt()函數用來處理跨域請求
使用APIView類也需要自己定義:get(),post(),put(),delete()等http方法函數。
相比django原生的CBV,這里的dispatch()函數包裝了request,提供了一個用于API的強大的request。另外還初始化了三個基礎功能:認證、權限、限流
提示:相對于基本CBV,APIView定制了request,專門用于API應用。另外還調用了三個基礎功能:認證、權限、限流。

三、通用視圖類GenericAPIView

通用視圖類GenericAPIView(APIView)
引入了兩個變量:
queryset表示數據集
serializer_class 表示序列化器類
get、post、put、delete等函數還需要有
提示:
1、這個類需要配合其他類,通過多繼承的方式使用。
2、有了數據集和序列化器類,我們還需要操作這些數據的方法:get、post、put…,下面的mixin系類分別定義了這些方法。以便根據自己的需求組合使用。

四、mixin混合類

mixins 是一種代碼復用機制,允許我們將多個組件共享的邏輯提取到一個獨立的對象中,從而提高代碼的可維護性和重用性。
這里新增了以下幾個類:CreateModelMixin、ListModelMixin、RetrieveModelMixin、UpdateModelMixin、DestroyModelMixin,每一個類里面只實現了類名稱種的方法。注意這里的5個方法和增刪改查查中的5個方法名稱不一致,需要在定義一下增刪改查查方法,然后只需要在具體方法內返回對應的mixin方法即可。
例如,CreateModelMixin類實現了create方法,可以實現對數據庫的增加操作
ListModelMixin類實現了list方法,可以實現對數據庫的查詢操作
RetrieveModelMixin類實現了retrieve方法,可以實現對數據庫的查詢操作
UpdateModelMixin類實現了update方法,可以實現對數據庫的修改操作
DestroyModelMixin類實現了destroy方法,可以實現對數據庫的刪除操作
使用方法:在視圖類中繼承GenericAPIView類和以上幾個類,然后在視圖類中定義queryset和serializer_class屬性
最后在urls.py中配置路徑
例如:
urls.py

urlpatterns = [path('houseku/', HouseKuList.as_view()),
]

views.py

class HouseKuList(generics.ListCreateAPIView, generics.GenericAPIView):queryset = HouseKu.objects.all()serializer_class = HouseKuSerializer# 這里還要寫get、post、delete等函數,用于對應Mixin里面的list、create等def get(self, request):return self.list(request) def post(self, request):return self.create(request)

提示:GenericAPIView提供了queryset、serializer_class,mixin混合類提供了方法(但這些方法不對應的method名稱)這兩個組合在一起,就實現了相應的功能。

五、Mixin再封裝,優化后的APIView

Mixin里面實現了list、create等方法,但是并沒有對應http的method,DRF實現了進一步封裝,創造了以下類:
ListCreateAPIView、RetrieveUpdateDestroyAPIView、ListAPIView、CreateAPIView、RetrieveAPIView、UpdateAPIView、DestroyAPIView
注意這里面沒有mixin,而有API,通過繼承這些類,可以實現對應的http方法:get、post、put、delete等,到這里,我們的客戶類就不需要再寫get、post、put、delete等方法了

class HouseKuViewSet(generics.ListCreateAPIView, generics.GenericAPIView):queryset = HouseKu.objects.all()serializer_class = HouseKuSerializer

提示:這里,***APIView已經封裝了method對應名稱的方法,組合起來,再配合GenericAPIView,只要提供queryset和serializer_class,就實現了所有的功能。

六、ViewSet

到這里,就不用再寫兩個(BookView用戶列表,BookDetailView用于詳細)自定義的類了。可以合二為一,然后在urls.py里面as_view的參數里,把put、post、delete等method自定義的函數關聯起來就可以了。
ViewSet(ViewSetMixin, views.APIView)
ViewSetMixin里面的as_view()方法可以加參數,用于指定method方法到自定義方法的映射。

path(“book/”, views.BookView.as_view({“get”:”get_all”, “post”:”add_object”})
path(“book/(?P<pk>\d+)”,views.BookView.as_view({“get”:”get_object”, “delete”:”delete_object”, “put”:”update_object”})

七、示例

APIView

urls.py

urlpatterns = [path('user/', views.UserView.as_view()),path('user/<int:pk>/', views.UserDetailView.as_view()),
]

views.py

from rest_framework.views import APIViewclass UserView(APIView):def get(self, request):users = User.objects.all()serializer = UserSerializer(users, many=True)return Response(serializer.data)def post(self, request):serializer = UserSerializer(data=request.data)if serializer.is_valid():serializer.save()return Response(serializer.data, status=201)return Response(serializer.errors, status=400)class UserDetailView(APIView):def get(self, request, pk):user = User.objects.get(pk=pk)serializer = UserSerializer(user)return Response(serializer.data)def put(self, request, pk):user = User.objects.get(pk=pk)serializer = UserSerializer(user, data=request.data)if serializer.is_valid():serializer.save()return Response(serializer.data)return Response(serializer.errors, status=400)def delete(self, request, pk):user = User.objects.get(pk=pk)user.delete()return Response(status=204)

GenericAPIView

需配合一系列的Mixin來使用
urls.py

urlpatterns = [path('mixin/user/', views.UserMixinView.as_view()),path('mixin/user/<int:pk>/', views.UserMixinDetailView.as_view()),
]

views.py

class UserMixinView(mixins.ListModelMixin,mixins.CreateModelMixin,generics.GenericAPIView):queryset = User.objects.all()serializer_class = UserSerializerdef get(self, request, *args, **kwargs):return self.list(request, *args, **kwargs)def post(self, request, *args, **kwargs):return self.create(request, *args, **kwargs)class UserMixinDetailView(mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,generics.GenericAPIView):queryset = User.objects.all()serializer_class = UserSerializerdef get(self, request, *args, **kwargs):return self.retrieve(request, *args, **kwargs)def put(self, request, *args, **kwargs):return self.update(request, *args, **kwargs)def delete(self, request, *args, **kwargs):return self.destroy(request, *args, **kwargs)

ListCreateAPIView、RetrieveUpdateDestroyApiView

urls.py

urlpatterns = [path('generic/user/', views.UserGenericView.as_view()),path('generic/user/<int:pk>/', views.UserGenericDetailView.as_view()),
]

views.py

class UserGenericView(generics.ListCreateAPIView):queryset = User.objects.all()serializer_class = UserSerializerclass UserGenericDetailView(generics.RetrieveUpdateDestroyAPIView):queryset = User.objects.all()serializer_class = UserSerializer

ViewSet

urls.py

urlpatterns = [path('viewset/user/', views.UserViewSet.as_view({'get': 'list', 'post': 'create'})),path('viewset/user/<int:pk>/', views.UserViewSet.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
]

到這里,已經將兩個類合二為一了,最簡潔,但是也最不靈活,適合用于不添加任何自己邏輯的增刪改查查
views.py

class UserViewSet(viewsets.ModelViewSet):queryset = User.objects.all()serializer_class = UserSerializer

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/73330.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/73330.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/73330.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

圖像分類數據集

《動手學深度學習》-3.5-學習筆記 # 通過ToTensor實例將圖像數據從PIL類型變換成32位浮點數格式&#xff0c; # 并除以255使得所有像素的數值均在0&#xff5e;1之間 trans transforms.ToTensor()#用于將圖像數據從 PIL 圖像格式&#xff08;Python Imaging Library&#xff…

架構師面試(十五):熔斷設計

問題 某電商平臺經常需要在大促運營活動中暫停評論、退款等業務&#xff0c;基于服務治理的設計理念&#xff0c;我們需要對該電商平臺微服務系統的【服務熔斷】進行設計&#xff0c;對此下面描述中說法正確的有哪幾項呢&#xff1f; A. 服務管控系統管理著平臺中所有服務之間…

Ubuntu20.04安裝運行DynaSLAM

目錄 一、安裝Anaconda 二、相關依賴庫安裝 1、boost安裝 2、Eigen 3安裝 3、opencv安裝 4、Pangolin安裝 三、配置Mask_RCNN環境 四、DynaSLAM編譯 五、DynaSLAM運行 一、安裝Anaconda 打開以下鏈接&#xff1a; Index of / 下載和自己系統匹配的安裝包。這里下…

X86 RouterOS 7.18 設置筆記三:防火墻設置(IPV4)

X86 j4125 4網口小主機折騰筆記五&#xff1a;PVE安裝ROS RouterOS X86 RouterOS 7.18 設置筆記一&#xff1a;基礎設置 X86 RouterOS 7.18 設置筆記二&#xff1a;網絡基礎設置(IPV4) X86 RouterOS 7.18 設置筆記三&#xff1a;防火墻設置(IPV4) X86 RouterOS 7.18 設置筆記四…

從 YOLOv1 到 YOLOv2:目標檢測的進化之路

引言 你有沒有想過&#xff0c;當你用手機拍一張照片&#xff0c;里面的人、車、狗是怎么被自動識別出來的&#xff1f;這背后靠的就是目標檢測技術。目標檢測是計算機視覺中的一個重要領域&#xff0c;它不僅要回答“圖片里有什么”&#xff0c;還要告訴你“這些東西在哪里”…

數據的存儲---整型、浮點型

目錄 一、整型在內存中的存儲 1. 原碼、反碼、補碼 2. 大端與小端 二、浮點數在內存中的存儲 1.浮點數的存 2. 浮點數的取 3. 題目解析 一個變量的創建需要在內存中開辟空間&#xff0c;而開辟的空間大小是由數據類型決定的。下面我們就來討論一下整型、浮點型在內存中的…

Java 大視界 -- Java 大數據在智能教育虛擬實驗室建設與實驗數據分析中的應用(132)

&#x1f496;親愛的朋友們&#xff0c;熱烈歡迎來到 青云交的博客&#xff01;能與諸位在此相逢&#xff0c;我倍感榮幸。在這飛速更迭的時代&#xff0c;我們都渴望一方心靈凈土&#xff0c;而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識&#xff0c;也…

??Jolt -- 通過JSON配置來處理復雜數據轉換的工具

簡介&#xff1a;一個能夠通過JSON配置&#xff08;特定的語法&#xff09;來處理復雜數據轉換的工具。 比如將API響應轉換為內部系統所需的格式&#xff0c;或者處理來自不同來源的數據結構差異。例如&#xff0c;將嵌套的JSON結構扁平化&#xff0c;或者重命名字段&#xff0…

47.全排列 II

47.全排列 II 力扣題目鏈接 給定一個可包含重復數字的序列 nums &#xff0c;按任意順序 返回所有不重復的全排列。 示例 1&#xff1a; 輸入&#xff1a;nums [1,1,2] 輸出&#xff1a; [[1,1,2],[1,2,1],[2,1,1]]示例 2&#xff1a; 輸入&#xff1a;nums [1,2,3] 輸出…

centos沒有ll

vi /etc/bashrc alias ll‘ls -l’ source /etc/bashrc

04 1個路由器配置一個子網的dhcp服務

前言 這是最近一個朋友的 ensp 相關的問題, 這里來大致了解一下 ensp, 計算機網絡拓撲 相關基礎知識 這里一系列文章, 主要是參照了這位博主的 ensp 專欄 這里 我只是做了一個記錄, 自己實際操作了一遍, 增強了一些 自己的理解 當然 這里僅僅是一個 簡單的示例, 實際場景…

網絡空間安全(31)安全巡檢

一、定義與目的 定義&#xff1a; 安全巡檢是指由專業人員或特定部門負責&#xff0c;對各類設施、設備、環境等進行全面或重點檢查&#xff0c;及時發現潛在的安全隱患或問題。 目的&#xff1a; 預防事故發生&#xff1a;通過定期的安全巡檢&#xff0c;及時發現并解決潛在的…

在IGH ethercat主站中Domain和Entry之間的關系

在 IGH EtherCAT 主站中&#xff0c;“domain”&#xff08;域&#xff09;和 “entry”&#xff08;條目&#xff09;存在著緊密的關系&#xff0c;具體如下&#xff1a; 數據組織與管理方面&#xff1a;“domain” 是 EtherCAT 主站中用于管理和處理從站配置、數據映射和數據…

信息學奧賽一本通 1449:【例題2】魔板

題目 1449&#xff1a;【例題2】魔板 分析 首先注意&#xff1a;輸入是按順時針給出的&#xff0c;但我們處理時需要按正常順序排&#xff0c;可以用以下代碼讀入 string s(8, 0); // 初始化全零字符串 cin>>s[0]>>s[1]>>s[2]>>s[3]; cin>>…

Unity開發的抖音小游戲接入抖音開放平臺中的流量主(抖音小游戲接入廣告)

前言:作者在進行小游戲審核版本的過程中,碰到了下列問題,所以對這個抖音小游戲接入廣告研究了下。 還有就是作者的TTSDK版本號是6.2.6,使用的Unity版本是Unity2022.3.29f1,最好和作者的兩個版本號保持一致,因為我發現TTSDK舊版的很多函數在新版中就已經無法正常使用了,必…

【xv6操作系統】系統調用與traps機制解析及實驗設計

【xv6操作系統】系統調用與traps機制解析及實驗設計 系統調用相關理論系統調用追溯系統調用實驗設計Sysinfo&#x1f6a9;系統調用總結&#xff08;結合trap機制&#xff09; traptrap機制trap代碼流程Backtrace實驗alarm實驗 系統調用 相關理論 隔離性&#xff08;isolation)…

Docker文件夾上傳秘籍Windows下的高效傳輸之道

哈嘍,大家好,我是木頭左! 一、理解Docker容器與Windows文件系統的差異 在深入探討如何從 Windows 系統將文件夾及遞歸文件夾和文件上傳到 Docker 容器之前,有必要先明晰 Docker 容器與 Windows 文件系統之間存在的本質差異。 (一)Docker 容器的文件系統特性 Docker 容…

08 | 實現版本號打印功能

提示&#xff1a; 所有體系課見專欄&#xff1a;Go 項目開發極速入門實戰課&#xff1b;歡迎加入 云原生 AI 實戰 星球&#xff0c;12 高質量體系課、20 高質量實戰項目助你在 AI 時代建立技術競爭力&#xff08;聚焦于 Go、云原生、AI Infra&#xff09;&#xff1b;本節課最終…

在微信小程序或前端開發中,picker 和 select 都是用戶交互中用于選擇的組件,但它們在功能、設計和使用場景上有一定的區別

在微信小程序或前端開發中&#xff0c;picker 和 select 都是用戶交互中用于選擇的組件&#xff0c;但它們在功能、設計和使用場景上有一定的區別。 1. picker 的特點 描述&#xff1a; picker 是微信小程序中的原生組件&#xff0c;通常用于選擇單項或多項值&#xff0c;如時…

PMP 證書的含金量怎么樣?

pmp含金量&#xff0c;這是一個很有爭議的話題&#xff0c;我根據我以往的面試跟工作經歷對 PMP 也有幾點看法&#xff0c;想跟大家聊一聊。 一、如果真心想做項目管理&#xff0c;PMP 一定要去考一個 現在的早已不是憑經驗做項目的時代了&#xff0c;各大企業都追求專業式的…