视图
GenericAPIView
# 路由
re_path(r'^(?P<version>[v1|v2]+)/api1/$', views.API1View.as_view(), name='api1')
# 视图
from rest_framework.generics import GenericAPIView
class API1View(GenericAPIView):
queryset = models.Role.objects.all()
serializer_class = RolesSerializers
pagination_class = MyPageNumberPagination
def get(self, request, *args, **kwargs):
# 获取数据
roles = self.get_queryset() # 等价于models.Role.objects.all()
# 分页
pager_ser = self.paginate_queryset(roles)
# 序列化
ser = self.get_serializer(instance=pager_ser, many=True)
return Response(ser.data)
和继承了APIView
的写法来说,没有什么优点可以说,一般没有什么用处。
GenericViewSet
继承class GenericViewSet(ViewSetMixin, generics.GenericAPIView):
,有事会先找左侧的类ViewSetMinin
。
# 路由
re_path(r'^(?P<version>[v1|v2]+)/api1/$', views.API1View.as_view({'get': 'list'}), name='api1')
# 视图
from rest_framework.viewsets import GenericViewSet
class API1View(GenericViewSet):
queryset = models.Role.objects.all()
serializer_class = RolesSerializers
pagination_class = MyPageNumberPagination
def list(self, request, *args, **kwargs):
# 获取数据
roles = self.get_queryset() # 等价于models.Role.objects.all()
# 分页
pager_ser = self.paginate_queryset(roles)
# 序列化
ser = self.get_serializer(instance=pager_ser, many=True)
return Response(ser.data)
此时,不在根据request.method的不同来执行不同的方法了,而是在as_view()中传递参数来指定请求方法和类中方法的对应关系。as_view({'get': 'list'})
表示get方法执行API1View
中的list
方法。
Mixin系列
这个系列帮我们完成了增删改查功能,我们只需要继承就可以了
# 路由
re_path(r'^(?P<version>[v1|v2]+)/api1/$', views.API1View.as_view({'get': 'list'}), name='api1')
# 视图
from rest_framework.viewsets import GenericViewSet
from rest_framework.mixins import ListModelMixin
class API1View(ListModelMixin, GenericViewSet):
queryset = models.Role.objects.all()
serializer_class = RolesSerializers
pagination_class = MyPageNumberPagination
ModelViewSet
集大成者,其继承了class ModelViewSet(mixins.CreateModelMixin, mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, mixins.ListModelMixin, GenericViewSet):
只需要很简单的几行代码就实现了增删改查,其中ListModelMixin
和CreateModelMixin
是不需要传递id,其他的都需要传递id,所以对url是有要求的,必须传递pk的值。
# 路由
re_path(r'^(?P<version>[v1|v2]+)/api1/$', views.API1View.as_view({'get': 'list', 'post': 'create'}), name='api1'),
re_path(r'^(?P<version>[v1|v2]+)/api1/(?P<pk>\d+)$', views.API1View.as_view({'get': 'retrieve', 'delete': 'destroy', 'put': 'update', 'patch': 'partial_update'}), name='api1')
# 视图
from rest_framework.viewsets import ModelViewSet
class API1View(ModelViewSet):
queryset = models.Role.objects.all()
serializer_class = RolesSerializers
pagination_class = MyPageNumberPagination
总结
- 只想用基本的增删改查,用ModelViewSet
- 只想用增删,用CreateModelMixin,DestroyModelMixin,GenericViewSet
- 要完成复杂的逻辑,用GenericViewSet或APIView