Django檢視擴充套件類知識點詳解
擴充套件類必須配合GenericAPIView使用擴充套件類內部的方法,在呼叫序列化器時,都是使用get_serializer
需要自定義get、post等請求方法,內部實現呼叫擴充套件類對應方法即可 。
一、mixins的檢視子類
作用:
提供了幾種後端檢視(對資料資源進行曾刪改查)處理流程的實現,如果需要編寫的檢視屬於這五種,則檢視可以通過繼承相應的擴充套件類來複用程式碼,減少自己編寫的程式碼量 。
這五個擴充套件類需要搭配GenericAPIView父類,因為五個擴充套件類的實現需要呼叫GenericAPIView提供的序列化器與資料庫查詢的方法。
1.1 ListModelMixin
列表檢視擴充套件類,提供list(request,*args,**kwargs)方法快速實現列表檢視,返回200狀態碼。
- 提供list方法,快速實現列表檢視
- 呼叫GenericAPIView設定好的結果集
- 呼叫GenericAPIView設定好的序列化器
該Mixin的list()方法會對資料進行過濾和分頁。
原始碼:
from rest_framework.mixins import ListModelMixin class ListModelMixin(object): """ List a queryset. """ def list(self,request,**kwargs): # 過濾 queryset = self.filter_queryset(self.get_queryset()) # 分頁 page = self.paginate_queryset(queryset) if page is not None: serializer = self.get_serializer(page,many=True) return self.get_paginated_response(serializer.data) # 序列化 serializer = self.get_serializer(queryset,many=True) return Response(serializer.data)
舉例:
from rest_framework.mixins import ListModelMixin from rest_framework.generics import GenericAPIView class BookListView(ListModelMixin,GenericAPIView): queryset = BookInfo.objects.all() serializer_class = BookInfoSerializer def get(self,request): return self.list(request)
1.2 CreateModelMixin
- 提供create(request,**kwargs)方法快速實現建立資源的檢視
- 實際建立功能由序列化的save方法完成
- save方法會去呼叫序列化器的create方法
如果序列化器對前端傳送的資料驗證失敗,返回400錯誤。
原始碼:
from rest_framework.mixins import CreateModelMixin class CreateModelMixin(object): """ Create a model instance. """ def create(self,**kwargs): # 獲取序列化器 serializer = self.get_serializer(data=request.data) # 驗證 serializer.is_valid(raise_exception=True) # 儲存 self.perform_create(serializer) headers = self.get_success_headers(serializer.data) return Response(serializer.data,status=status.HTTP_201_CREATED,headers=headers) def perform_create(self,serializer): serializer.save() def get_success_headers(self,data): try: return {'Location': str(data[api_settings.URL_FIELD_NAME])} except (TypeError,KeyError): return {}
1.3 RetrieveModelMixin
詳情檢視擴充套件類,提供retrieve(request,**kwargs)方法,可以快速實現返回一個存在的資料物件。
如果存在,返回200, 否則返回404。
原始碼:
from rest_framework.mixins import RetrieveModelMixin class RetrieveModelMixin(object): """ Retrieve a model instance. """ def retrieve(self,**kwargs): # 獲取物件,會檢查物件的許可權 instance = self.get_object() # 序列化 serializer = self.get_serializer(instance) return Response(serializer.data)
舉例:
from rest_framework.mixins import RetrieveModelMixin from rest_framework.generics import GenericAPIView class BookDetailView(RetrieveModelMixin,pk): return self.retrieve(request)
1.4 UpdateModelMixin
更新檢視擴充套件類,提供update(request,**kwargs)方法
- 可以快速實現更新一個存在的資料物件。
- 同時也提供partial_update(request,**kwargs)方法,可以實現區域性更新。
- 內部更新功能呼叫序列化器的save方法
- save方法會呼叫序列化器的update方法
成功返回200,序列化器校驗資料失敗時,返回400錯誤。
原始碼:
from rest_framework.mixins import UpdateModelMixin class UpdateModelMixin(object): """ Update a model instance. """ def update(self,**kwargs): partial = kwargs.pop('partial',False) instance = self.get_object() serializer = self.get_serializer(instance,data=request.data,partial=partial) serializer.is_valid(raise_exception=True) self.perform_update(serializer) if getattr(instance,'_prefetched_objects_cache',None): # If 'prefetch_related' has been applied to a queryset,we need to # forcibly invalidate the prefetch cache on the instance. instance._prefetched_objects_cache = {} return Response(serializer.data) def perform_update(self,serializer): serializer.save() def partial_update(self,**kwargs): kwargs['partial'] = True return self.update(request,**kwargs)
1.5 DestroyModelMixin
刪除檢視擴充套件類,提供destroy(request,**kwargs)方法,可以快速實現刪除一個存在的資料物件。
成功返回204,不存在返回404。
原始碼:
from rest_framework.mixins import DestroyModelMixin class DestroyModelMixin(object): """ Destroy a model instance. """ def destroy(self,**kwargs): instance = self.get_object() self.perform_destroy(instance) return Response(status=status.HTTP_204_NO_CONTENT) def perform_destroy(self,instance): instance.delete()
使用GenericAPIView和檢視擴充套件類,實現api介面,程式碼:
"""GenericAPIView結合檢視擴充套件類實現api介面""" from rest_framework.generics import GenericAPIView from rest_framework.mixins import ListModelMixin,CreateModelMixin class Students2GenericAPIView(GenericAPIView,ListModelMixin,CreateModelMixin): # 本次檢視類中要操作的資料[必填] queryset = Student.objects.all() # 本次檢視類中要呼叫的預設序列化器[玄天] serializer_class = StudentModelSerializer def get(self,request): """獲取多個學生資訊""" return self.list(request) def post(self,request): """新增學生資訊""" return self.create(request)
from rest_framework.mixins import RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin from rest_framework.generics import GenericAPIView class Student2GenericAPIView(GenericAPIView,RetrieveModelMixin,DestroyModelMixin): queryset = Student.objects.all() serializer_class = StudentModelSerializer # 在使用GenericAPIView檢視獲取或操作單個數據時,檢視方法中的代表主鍵的引數最好是pk def get(self,pk): """獲取一條資料""" return self.retrieve(request,pk) def put(self,pk): """更新一條資料""" return self.update(request,pk) def delete(self,pk): """刪除一條資料""" return self.destroy(request,pk)
二 、Generic的檢視子類
2.1 CreateAPIView
提供 post方法
繼承自: GenericAPIView、`CreateModelMixin
2.2 ListAPIView
提供 get 方法
繼承自:GenericAPIView、ListModelMixin
2.3 RetrieveAPIView
提供 get方法
繼承自: GenericAPIView、RetrieveModelMixin
2.4 DestoryAPIView
提供 delete方法
繼承自:GenericAPIView、DestoryModelMixin
2.5 UpdateAPIView
提供 put和 patch方法
繼承自:GenericAPIView、UpdateModelMixin
2.6 RetrieveUpdateAPIView
提供 get、put、patch方法
繼承自: GenericAPIView、RetrieveModelMixin、UpdateModelMixin
2.7 RetrieveUpdateDestoryAPIView
提供 get、put、patch、delete方法
繼承自:GenericAPIView、RetrieveModelMixin、UpdateModelMixin、DestoryModelMixin
以上就是本次介紹的全部知識點內容,感謝大家的學習和對我們的支援。