四、类视图继承的父类区别
1、继承APIView
- 如果两个类视图合并,会出现两个get方法会冲突的问题
- 如果使用Mixin中提供的拓展方法(action动作),当前DRF是无法识别这些action
- class ProjectViewSet(APIView):
2、继承ViewSet视图集
- 两个类视图可以合并,尤其是有2个get方法的类视图
- 支持这些action,并在定义url路由时,可以在as_view({"请求方法名": "action名称"})
- 例如as_view({'get':'retrieve','put':'update','delete':'destroy','patch':'partial_update'})
- as_view({'get':'list','post':'create',})
- 继承ViewSetMixin()(ViewSetMixin提供的能力,改写as_view(),以便它接受' actions '关键字来执行将HTTP方法绑定到资源上的操作。),views.APIView
- 需要自定义action
- 并且不支持分页、过滤、排序功能
- class ProjectViewSet(viewsets.ViewSet):
class ProjectsViewSet(viewsets.ViewSet): # 指定当前类视图需要使用的查询集 queryset = ProjectsModel.objects.all() # 指定当前类视图需要使用的序列化器类 serializer_class = ProjectModelSerializer # lookup_field = 'Id' # 声明需要使用的引擎类 filter_backends = [filters.SearchFilter, filters.OrderingFilter ] # 定义需要过滤的字段 search_fields = ['name', 'id'] # 定义需要排序的字段 ordering_fields = ['id', 'name'] # 声明需要使用的分页引擎 pagination_class = PageNumberPagination def retrieve(self, request, *args, **kwargs): # 需要自定义action pass def list(self, request, *args, **kwargs): pass def put(self, request, *args, **kwargs): pass def destroy(self, request, *args, **kwargs): pass def create(self, request, *args, **kwargs): pass def partial_update(self, request, *args, **kwargs): pass
3、继承GenericViewSet通用视图集
- 两个类视图可以合并,尤其是有2个get方法的类视图
- 继承 ViewSetMixin, generics.GenericAPIView
- ViewSetMixin提供了路由识别action的能力
- 支持分页、过滤、排序功能(因为有继承generics.GenericAPIView)
- 可以先声明queryset、serializer_class
- 未提供action方法
- class ProjectViewSet(viewsets.GenericViewSet):
class ProjectsViewSet( mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, mixins.ListModelMixin, mixins.CreateModelMixin, viewsets.GenericViewSet): # 指定当前类视图需要使用的查询集 queryset = ProjectsModel.objects.all() # 指定当前类视图需要使用的序列化器类 serializer_class = ProjectModelSerializer # lookup_field = 'Id' # 声明需要使用的引擎类 filter_backends = [filters.SearchFilter, filters.OrderingFilter ] # 定义需要过滤的字段 search_fields = ['name', 'id'] # 定义需要排序的字段 ordering_fields = ['id', 'name'] # 声明需要使用的分页引擎 pagination_class = PageNumberPagination # 因为继承了mixins里的各种action方法,所以自定义的action就可以不用写了 # 如果请求方法为get -> retrieve方法 # def retrieve(self, request, *args, **kwargs): # pass # 如果请求方法为get -> list方法 # def list(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 # # def partial_update(self, request, *args, **kwargs): # pass
🔼因为继承了mixins里的各种action方法,所以自定义的action就可以不用写了(上面被注释的代码!)
上面继承了太多的 mixins,我们可以找个全部继承了这些类的子类 来继承,这就是ModelViewSet模型视图集类
最后可以简化为:
class ProjectsViewSet(viewsets.ModelViewSet):