1. 优化前代码
from projects.models import Projects
from projects.serializers import ProjectsModelSerializers
from rest_framework.generics import GenericAPIView
from rest_framework.response import Response
from rest_framework import status
class ProjectList(GenericAPIView):
queryset = Projects.objects.all()
serializer_class = ProjectsModelSerializers
filterset_fields = ['id', 'name', 'leader']
ordering_fields = ['id', 'name', 'leader']
def get(self, request):
qs = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(qs)
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=qs, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
def post(self, request):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
class ProjectDetail(GenericAPIView):
queryset = Projects.objects.all()
serializer_class = ProjectsModelSerializers
lookup_field = 'id'
def get(self, request, id):
qs = self.get_object()
serializer = self.get_serializer(instance=qs)
return Response(serializer.data, status=status.HTTP_200_OK)
def put(self, request, id):
qs = self.get_object()
serializer = self.get_serializer(instance=qs, data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
def delete(self, request, id):
qs = self.get_object()
qs.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
from rest_framework.generics import GenericAPIView
from projects.models import Projects
from projects.serializers import ProjectsModelSerializers
class ProjectList(mixins.ListModelMixin, mixins.CreateModelMixin, GenericAPIView):
queryset = Projects.objects.all()
serializer_class = ProjectsModelSerializers
ordering_fields = ['id', 'name', 'leader']
filterset_fields = ['id', 'name', 'leader']
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 = ProjectsModelSerializers
lookup_field = 'id'
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的方法, 继承即可省略方法代码
from rest_framework import generics
from projects.models import Projects
from projects.serializers import ProjectsModelSerializers
class ProjectList(generics.ListCreateAPIView):
queryset = Projects.objects.all()
serializer_class = ProjectsModelSerializers
ordering_fields = ['id', 'name', 'leader']
filterset_fields = ['id', 'name', 'leader']
class ProjectDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Projects.objects.all()
serializer_class = ProjectsModelSerializers
lookup_field = 'id'
2.3 优化3
- DRF中viewsets.ViewSet不支持get、post、put、delete方法,只支持action动作,来合并类视图
from rest_framework import viewsets
from projects.models import Projects
from projects.serializers import ProjectsModelSerializers
class ProjectViewSet(viewsets.GenericViewSet):
queryset = Projects.objects.all()
serializer_class = ProjectsModelSerializers
ordering_fields = ['id', 'name', 'leader']
filterset_fields = ['id', 'name', 'leader']
lookup_field = 'id'
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
from rest_framework import viewsets, mixins
from projects.models import Projects
from projects.serializers import ProjectsModelSerializers
class ProjectViewSet(mixins.ListModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.CreateModelMixin,
viewsets.GenericViewSet):
queryset = Projects.objects.all()
serializer_class = ProjectsModelSerializers
ordering_fields = ['id', 'name', 'leader']
filterset_fields = ['id', 'name', 'leader']
lookup_field = 'id'
from rest_framework import routers
from projects import views
router = routers.DefaultRouter()
router.register(r'projects', views.ProjectViewSet)
urlpatterns = []
urlpatterns += router.urls
2.5 优化5
from rest_framework import viewsets
from projects.models import Projects
from projects.serializers import ProjectsModelSerializers
class ProjectViewSet(viewsets.ModelViewSet):
queryset = Projects.objects.all()
serializer_class = ProjectsModelSerializers
ordering_fields = ['id', 'name', 'leader']
filterset_fields = ['id', 'name', 'leader']
lookup_field = 'id'