在上一章优化了的基础上,再次优化
from projects.models import Projects
from projects.serializer import ProjectModelSerializer
from rest_framework.generics import GenericAPIView
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import mixins
## 注意先继承mixins的方法
class ProjectsList(mixins.ListModelMixin,
mixins.CreateModelMixin,
GenericAPIView):
ordering_fields = ['name', 'leader']
queryset =Projects.objects.all()
serializer_class = ProjectModelSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ['name', 'desc']
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)
一、generics
/Concrete Generic Views
从该文件的类方法源码,可以看到这些方法都继承了mixins
和GenericAPIView
类,并实现了和上面的get/post等方法的组合的方法
比如rest_framework.generics.ListCreateAPIView
:
class ListCreateAPIView(mixins.ListModelMixin,
mixins.CreateModelMixin,
GenericAPIView):
"""
Concrete view for listing a queryset or creating a model instance.
"""
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
generics
/Concrete Generic Views
中的类,可以根据自己的需要来继承这些类
-
RetrieveAPIView
1.提供get
方法
2.继承:RetrieveModelMixin
、GenericAPIView
-
UpdateAPIView
1.提供put
、patch
方法
2.继承:UpdateModelMixin
、GenericAPIView
-
DestroyAPIView
1.提供delete
方法
2.继承:DestoryModelMixin
、GenericAPIView
-
ListAPIView
1.提供get
方法
2.继承:ListModelMixin
、GenericAPIView
-
CreateAPIView
1.提供post
方法
2.继承:CreateModelMixin
、GenericAPIView
-
ListCreateAPIView
1.提供post
、get
方法
2.继承:ListModelMixin
、CreateModelMixin
、GenericAPIView
-
RetrieveUpdateAPIView
1.提供get
、delete
方法
2.继承:RetrieveModelMixin
、DestoryModelMixin
、GenericAPIView
-
RetrieveUpdateDestoryAPIView
1.提供get
、put
、delete
方法
2.继承:RetrieveModelMixin
、UpdateModelMixin
、DestoryModelMixin
、GenericAPIView
所以,可以直接继承generics
中满足所需的方法,并可优化成:
from projects.models import Projects
from projects.serializer import ProjectModelSerializer
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import generics
class ProjectsList(generics.ListCreateAPIView):
ordering_fields = ['name', 'leader']
queryset = Projects.objects.all()
serializer_class = ProjectModelSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ['name', 'leader', 'tester']
class ProjectDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Projects.objects.all()
serializer_class = ProjectModelSerializer
generics
/Concrete Generic Views
的痛点
- 上面的代码中,还是有两个类视图,还不能合并
- 两个类视图中,有相同的
get
方法,会冲突 - 两个类视图所对应的
url
地址依旧不一致
网友评论