1. 优化前代码
from rest_framework.response import Response
from rest_framework import status, filters
from rest_framework.generics import GenericAPIView
from django_filters.rest_framework.backends import DjangoFilterBackend
from projects.models import Projects
from projects.serializer import ProjectModelSerializer
from utils.pagination import PageNumberPaginationManual
class ProjectList(GenericAPIView):
queryset = Projects.objects.all()
serializer_class = ProjectModelSerializer
ordering_fields = ['id', 'pj_name', 'pj_leader']
filterset_fields = ['id', 'pj_name', 'pj_leader']
def get(self, request):
projects = self.get_queryset()
projects = self.filter_queryset(projects)
page = self.paginate_queryset(projects)
if page is not None:
serializer = self.get_serializer(instance=page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(instance=page, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
def post(self, request):
serializer = self.get_serializer(data=request.data)
try:
serializer.is_valid(raise_exception=True)
except Exception as e:
return Response(serializer.errors)
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
class ProjectDetail(GenericAPIView):
queryset = Projects.objects.all()
serializer_class = ProjectModelSerializer
lookup_field = 'id'
def get(self, request, id):
project = self.get_object()
serializer = self.get_serializer(instance=project)
return Response(serializer.data, status=status.HTTP_200_OK)
def put(self, request, id):
project = self.get_object()
serializer = self.get_serializer(instance=project, data=request.data)
try:
serializer.is_valid(raise_exception=True)
except Exception as e:
return Response(serializer.errors)
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
def delete(self, request, id):
project = self.get_object()
project.delete()
return Response(None, status=status.HTTP_204_NO_CONTENT)
from django.urls import path
from projects import views
urlpatterns = [
path('projects/', views.ProjectList.as_view()),
path('projects/<int:id>', views.ProjectDetail.as_view())]
2. 类视图优化
2.1 优化1
- mixins中定义了类视图的功能方法, 继承mixins并调用这些方法即可
from rest_framework import mixins, generics, viewsets
from rest_framework.generics import GenericAPIView
from rest_framework.response import Response
from projects.models import Projects
from projects.serializer import ProjectModelSerializer
from utils.pagination import PageNumberPaginationManual
from rest_framework.decorators import action
class ProjectList(mixins.ListModelMixin, mixins.CreateModelMixin, GenericAPIView):
queryset = Projects.objects.all()
serializer_class = ProjectModelSerializer
ordering_fields = ['id', 'pj_name', 'pj_leader']
filterset_fields = ['id', 'pj_name', 'pj_leader']
pagination_class = PageNumberPaginationManual
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 ProjectDetail(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, GenericAPIView):
queryset = Projects.objects.all()
serializer_class = ProjectModelSerializer
def 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)
2.2 优化2
- 继承generics中APIView来简化代码
- generics.APIView中定义了优化1的方法, 继承即可省略方法代码
class ProjectList(generics.ListCreateAPIView):
queryset = Projects.objects.all()
serializer_class = ProjectModelSerializer
ordering_fields = ['id', 'pj_name', 'pj_leader']
filterset_fields = ['id', 'pj_name', 'pj_leader']
class ProjectDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Projects.objects.all()
serializer_class = ProjectModelSerializer
2.3 优化3
- DRF中viewsets.ViewSet不支持get、post、put、delete方法,只支持action动作,来合并类视图
class ProjectViewSet(viewsets.GenericViewSet):
queryset = Projects.objects.all()
serializer_class = ProjectModelSerializer
ordering_fields = ['id', 'pj_name', 'pj_leader']
filterset_fields = ['id', 'pj_name', 'pj_leader']
def list(self, request, *args, **kwargs):
pass
def retrieve(self, request, *args, **kwargs):
pass
def update(self, request, *args, **kwargs):
pass
def destroy(self, request, *args, **kwargs):
pass
def create(self, request, *args, **kwargs):
pass
from django.urls import path
from projects import views
urlpatterns = [
path('projects/', views.ProjectViewSet.as_view({
'get': 'list',
'post': 'create'
}), name='projects-list'),
path('projects/<int:id>/', views.ProjectViewSet.as_view({
'get': 'retrieve',
'put': 'update',
'delete': 'destroy'
})),
2.4 优化4
class ProjectViewSet(mixins.ListModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.CreateModelMixin,
viewsets.GenericViewSet):
queryset = Projects.objects.all()
serializer_class = ProjectModelSerializer
ordering_fields = ['id', 'pj_name', 'pj_leader']
filterset_fields = ['id', 'pj_name', 'pj_leader']
2.5 优化5
class ProjectViewSet(viewsets.ModelViewSet):
queryset = Projects.objects.all()
serializer_class = ProjectModelSerializer
ordering_fields = ['id', 'pj_name', 'pj_leader']
filterset_fields = ['id', 'pj_name', 'pj_leader']