1. 程式人生 > 實用技巧 >DRF框架generics之CreateAPIView、ListAPIView、RetrieveAPIView、DestroyAPIView、UpdateAPIView、ListCreateAPIView、RetrieveUpdateAPIView、RetrieveDestroyAPIView、RetrieveUpdateDestroyAPIView

DRF框架generics之CreateAPIView、ListAPIView、RetrieveAPIView、DestroyAPIView、UpdateAPIView、ListCreateAPIView、RetrieveUpdateAPIView、RetrieveDestroyAPIView、RetrieveUpdateDestroyAPIView

先來看看之前優化的程式碼:

from rest_framework.generics import GenericAPIView
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import OrderingFilter
from rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin
from utils.pagination import NewPagination from .models import Projects from .serializers import ProjectsModelSerializer class ProjectsPage(ListModelMixin, CreateModelMixin, GenericAPIView): ''' 類檢視 ''' queryset = Projects.objects.all() serializer_class
= ProjectsModelSerializer filter_backends = [DjangoFilterBackend, OrderingFilter] filterset_fields = ['id', 'name', 'leader', 'programmer', 'tester'] ordering_fields = ['id', 'name', 'leader', 'programmer', 'tester'] pagination_class = NewPagination def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs) def post(self, request, *args, **kwargs): return self.create(request, *args, **kwargs) class ProjectsDetailsPage(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericAPIView): queryset = Projects.objects.all() serializer_class = ProjectsModelSerializer def get(self, request, *args, **kwargs): self.retrieve(request, *args, **kwargs) def put(self, request, *args, **kwargs): self.update(request, *args, **kwargs) def delete(self, request, *args, **kwargs): return self.destroy(request, *args, **kwargs)

上面的程式碼優化只針對當前檢視,一般一個專案會有很多個檢視,如果有很多檢視結構都跟上面的相似,那可不可以不要每次都cv這些請求方法呢?

本章我們通過generics模組中的一系列類來繼續優化檢視當中的請求方法,先看看generics模組的Structure:

generics模組下主要有以下類來做優化

  • CreateAPIView:繼承了mixins.CreateModelMixin和GenericAPIView
  • ListAPIView:繼承了mixins.ListModelMixin和GenericAPIView
  • RetrieveAPIView:繼承了mixins.RetrieveModelMixin和GenericAPIView
  • DestroyAPIView:繼承了mixins.DestroyModelMixin和GenericAPIView
  • UpdateAPIView:繼承了mixins.UpdateModelMixin和GenericAPIView
  • ListCreateAPIView:繼承了mixins.ListModelMixin、mixins.CreateModelMixin和GenericAPIView
  • RetrieveUpdateAPIView:繼承了mixins.RetrieveModelMixin、mixins.UpdateModelMixin和GenericAPIView
  • RetrieveDestroyAPIView:繼承了mixins.RetrieveModelMixin、mixins.DestroyModelMixin和GenericAPIView
  • RetrieveUpdateDestroyAPIView:繼承了mixins.RetrieveModelMixin、mixins.UpdateModelMixin、mixins.DestroyModelMixin和GenericAPIView

由於ProjectsPage檢視類有獲取專案列表資訊的get請求和建立專案的post請求,因此可以繼承ListCreateAPIView類來進行優化

class ProjectsPage(ListCreateAPIView):
    '''
    類檢視
    '''
    queryset = Projects.objects.all()
    serializer_class = ProjectsModelSerializer

    filter_backends = [DjangoFilterBackend, OrderingFilter]
    filterset_fields = ['id', 'name', 'leader', 'programmer', 'tester']
    ordering_fields = ['id', 'name', 'leader', 'programmer', 'tester']
    pagination_class = NewPagination

ProjectsDetailsPage檢視類有獲取專案詳情的get請求,更新的put請求和刪除專案的delete請求,因此可以繼承RetrieveUpdateDestroyAPIView類來進行優化

class ProjectsDetailsPage(RetrieveUpdateDestroyAPIView):

    queryset = Projects.objects.all()
    serializer_class = ProjectsModelSerializer