擴展類必須配合GenericAPIView
使用擴展類內部的方法,在調用序列化器時,都是使用get_serializer
前端
須要自定義get
、post
等請求方法,內部實現調用擴展類對應方法便可 。python
做用:數據庫
提供了幾種後端視圖(對數據資源進行曾刪改查)處理流程的實現,若是須要編寫的視圖屬於這五種,則視圖能夠經過繼承相應的擴展類來複用代碼,減小本身編寫的代碼量 。django
這五個擴展類須要搭配GenericAPIView
父類,由於五個擴展類的實現須要調用GenericAPIView
提供的序列化器與數據庫查詢的方法。後端
列表視圖擴展類,提供list(request, *args, **kwargs)
方法快速實現列表視圖,返回200狀態碼。api
list
方法,快速實現列表視圖GenericAPIView
設置好的結果集GenericAPIView
設置好的序列化器該Mixin
的list()
方法會對數據進行過濾和分頁。app
源代碼:iview
from rest_framework.mixins import ListModelMixin class ListModelMixin(object): """ List a queryset. """ def list(self, request, *args, **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)
舉例:post
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)
建立視圖擴展類,提供create(request, *args, **kwargs)
方法快速實現建立資源的視圖,成功返回201狀態碼。fetch
create(request, *args, **kwargs)
方法快速實現建立資源的視圖save
方法完成save
方法會去調用序列化器的create
方法若是序列化器對前端發送的數據驗證失敗,返回400錯誤。
源代碼:
from rest_framework.mixins import CreateModelMixin class CreateModelMixin(object): """ Create a model instance. """ def create(self, request, *args, **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 {}
詳情視圖擴展類,提供retrieve(request, *args, **kwargs)
方法,能夠快速實現返回一個存在的數據對象。
若是存在,返回200, 不然返回404。
源代碼:
from rest_framework.mixins import RetrieveModelMixin class RetrieveModelMixin(object): """ Retrieve a model instance. """ def retrieve(self, request, *args, **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, GenericAPIView): queryset = BookInfo.objects.all() serializer_class = BookInfoSerializer def get(self, request, pk): return self.retrieve(request)
更新視圖擴展類,提供update(request, *args, **kwargs)
方法
partial_update(request, *args, **kwargs)
方法,能夠實現局部更新。save
方法save
方法會調用序列化器的update
方法成功返回200,序列化器校驗數據失敗時,返回400錯誤。
源代碼:
from rest_framework.mixins import UpdateModelMixin class UpdateModelMixin(object): """ Update a model instance. """ def update(self, request, *args, **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, request, *args, **kwargs): kwargs['partial'] = True return self.update(request, *args, **kwargs)
刪除視圖擴展類,提供destroy(request, *args, **kwargs)
方法,能夠快速實現刪除一個存在的數據對象。
成功返回204,不存在返回404。
源代碼:
from rest_framework.mixins import DestroyModelMixin class DestroyModelMixin(object): """ Destroy a model instance. """ def destroy(self, request, *args, **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,UpdateModelMixin,DestroyModelMixin): queryset = Student.objects.all() serializer_class = StudentModelSerializer # 在使用GenericAPIView視圖獲取或操做單個數據時,視圖方法中的表明主鍵的參數最好是pk def get(self,request,pk): """獲取一條數據""" return self.retrieve(request,pk) def put(self,request,pk): """更新一條數據""" return self.update(request,pk) def delete(self,request,pk): """刪除一條數據""" return self.destroy(request,pk)
提供 post
方法
繼承自: GenericAPIView
、`CreateModelMixin
提供 get
方法
繼承自:GenericAPIView
、ListModelMixin
提供 get
方法
繼承自: GenericAPIView
、RetrieveModelMixin
提供 delete
方法
繼承自:GenericAPIView
、DestoryModelMixin
提供 put
和 patch
方法
繼承自:GenericAPIView
、UpdateModelMixin
提供 get
、put
、patch
方法
繼承自: GenericAPIView
、RetrieveModelMixin
、UpdateModelMixin
提供 get
、put
、patch
、delete
方法
繼承自:GenericAPIView
、RetrieveModelMixin
、UpdateModelMixin
、DestoryModelMixin