这几天我们自定义的视图类都是继承的APIView,那么其实restframework为我们提供了几个视图类,各自有着不同的功能,我们可以选择继承其中的几个类来帮我们做事从而减少自己写的代码,这里就说一下restframework中视图类的继承关系
1、第一个类GenericAPIView
这个类就继承了APIView,但这个类其实没什么用,并没有帮我们做更多的事
from rest_framework.generics import GenericAPIViewclass PagerSerialiser(serializers.ModelSerializer): class Meta: model = models.Role fields = "__all__"class View1View(GenericAPIView): # APIView queryset = models.Role.objects.all() # 指定序列化类 serializer_class = PagerSerialiser # 指定分页类,这里用的是第一种情况的分页 pagination_class = PageNumberPagination def get(self, request, *args, **kwargs): # 获取数据,这里就会用到上面定义的queryset,根据这个参数获取数据 roles = self.get_queryset() # models.Role.objects.all() # 获取分页后的数据 pager_roles = self.paginate_queryset(roles) # 序列化 ser = self.get_serializer(instance=pager_roles, many=True) return Response(ser.data)
2、第二个类GenericViewSet
这个类继承了两个类,左继承ViewSetMixin,右继承generics.GenericAPIView
这里继承的ViewSetMixin就会重写as_view方法,不会再去APIView中找了,会改变不同请求method对应的方法名
# URL中:重写as_view方法,{'get': 'list'}这个参数就代表着GET请求对应的get方法改为list# 所以我们在自定义view中针对GET请求的处理就要写list函数了url(r'^(?P[v1|v2]+)/v1/$', views.View1View.as_view({ 'get': 'list'})),from rest_framework.viewsets import GenericViewSetclass PagerSerialiser(serializers.ModelSerializer): class Meta: model = models.Role fields = "__all__"class View1View(GenericViewSet): queryset = models.Role.objects.all() # 指定序列化类和分页类 serializer_class = PagerSerialiser pagination_class = PageNumberPagination def list(self, request, *args, **kwargs): # 获取数据,还是要用到上面的queryset属性 roles = self.get_queryset() # models.Role.objects.all() # 获取分页的结果 pager_roles = self.paginate_queryset(roles) # 序列化 ser = self.get_serializer(instance=pager_roles, many=True) return Response(ser.data)
3、第三个类ModelViewSet
继承了六个类:
mixins.CreateModelMixin, 为我们提供了添加对象的方法
mixins.RetrieveModelMixin, 为我们提供了显示多个对象的方法,但是没有分页
mixins.UpdateModelMixin, 为我们提供修改数据的方法
mixins.DestroyModelMixin, 为我们提供删除数据的方法
mixins.ListModelMixin, 为我们提供显示多个对象的方法,并且包含分页
GenericViewSet 就是上面说到的第二个类
from rest_framework.viewsets import GenericViewSet, ModelViewSetfrom rest_framework.mixins import ListModelMixin, CreateModelMixin# 这个类因为继承了GenericViewSet所以as_view方法会重写# URL中:url(r'^(?P[v1|v2]+)/v1/$', views.View1View.as_view({ 'get': 'list','post':'create'})),url(r'^(?P [v1|v2]+)/v1/(?P \d+)/$', views.View1View.as_view({ 'get': 'retrieve', 'delete':'destroy', 'put':'update', 'patch':'partial_update'})),class PagerSerialiser(serializers.ModelSerializer): class Meta: model = models.Role fields = "__all__"class View1View(ModelViewSet): queryset = models.Role.objects.all() serializer_class = PagerSerialiser pagination_class = PageNumberPagination def list(self, request, *args, **kwargs): # 获取数据,还是要用到上面的queryset属性 roles = self.get_queryset() # models.Role.objects.all() # 获取分页的结果 pager_roles = self.paginate_queryset(roles) # 序列化 ser = self.get_serializer(instance=pager_roles, many=True) return Response(ser.data)
4、不同逻辑
a. 增删改查 ModelViewSet
b. 增删 CreateModelMixin,DestroyModelMixin GenericViewSet c. 复杂逻辑 GenericViewSet 或 APIView
5、总结restframework中视图类的继承关系