21、Django_rest framework_Concret
2020-03-08 本文已影响0人
猪儿打滚
在上一章优化了的基础上,再次优化
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地址依旧不一致