作用:
提供了幾種後端檢視(對資料資源進行曾刪改查)處理流程的實現,如果需要編寫的檢視屬於這五種,則檢視可以透過繼承相應的擴充套件類來複用程式碼,減少自己編寫的程式碼量。
這五個擴充套件類需要搭配GenericAPIView父類,因為五個擴充套件類的實現需要呼叫GenericAPIView提供的序列化器與資料庫查詢的方法。
1)ListModelMixin
列表檢視擴充套件類,提供list(request, *args, **kwargs)
方法快速實現列表檢視,返回200狀態碼。
該Mixin的list方法會對資料進行過濾和分頁。
原始碼:
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)
舉例:
from rest_framework.mixins import ListModelMixin class BookListView(ListModelMixin, GenericAPIView): queryset = BookInfo.objects.all() serializer_class = BookInfoSerializer def get(self, request): return self.list(request)
2)CreateModelMixin
建立檢視擴充套件類,提供create(request, *args, **kwargs)
方法快速實現建立資源的檢視,成功返回201狀態碼。
如果序列化器對前端傳送的資料驗證失敗,返回400錯誤。
原始碼:
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 {}
3) RetrieveModelMixin
詳情檢視擴充套件類,提供retrieve(request, *args, **kwargs)
方法,可以快速實現返回一個存在的資料物件。
如果存在,返回200, 否則返回404。
原始碼:
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)
舉例:
class BookDetailView(RetrieveModelMixin, GenericAPIView): queryset = BookInfo.objects.all() serializer_class = BookInfoSerializer def get(self, request, pk): return self.retrieve(request)
4)UpdateModelMixin
更新檢視擴充套件類,提供update(request, *args, **kwargs)
方法,可以快速實現更新一個存在的資料物件。
同時也提供partial_update(request, *args, **kwargs)
方法,可以實現區域性更新。
成功返回200,序列化器校驗資料失敗時,返回400錯誤。
原始碼:
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)
5)DestroyModelMixin
刪除檢視擴充套件類,提供destroy(request, *args, **kwargs)
方法,可以快速實現刪除一個存在的資料物件。
成功返回204,不存在返回404。
原始碼:
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()