一、优化代码
上面的代码为项目的获取、更新、查找、创建、删除操作,当我变为用例的获取、更新、查找、创建、删除操作时,只需要改变这些代码:
针对上面的代码进行优化,
1、抽取获取列表数据逻辑
a、创建ListModelMixin类,在类中定义list()方法,将ProjectView类中的get()方法中的代码拷贝到list()方法中,ProjectView继承ListModelMixin。
优化后的代码:
b、python中支持多重继承,一个类可以同时继承多个类
c、类中的方法和属性时按照__mro__所指定的的继承顺序进行查找的
(<class ‘projects.views_bf.ProjectsView’>,
<class ‘projects.views_bf.ListModelMixin’>,
<class ‘rest_framework.generics.GenericAPIView’>,
<class ‘rest_framework.views.APIView’>,
<class ‘django.views.generic.base.View’>,
<class ‘object’>)
Mixin拓展类
2、抽取创建数据逻辑
a、创建CreateModelMixin类,在类中定义create()方法,将ProjectView类中的post()方法中的代码拷贝到create()方法中,ProjectView继承CreateModelMixin。
由于父类给我们提供了ListModelMixin、CreateModelMixin类,直接继承就可以,不需要我们去定义。
优化后如下图所示:
3、对抽取获取列表数据逻辑、抽取创建数据逻辑再次进行优化
a、创建ListCreateAPIView类,并继承mixins.ListModelMixin,mixins.CreateModelMixin,GenericAPIView类
将ProjectsView类中的方法拷贝到ListCreateAPIView类中
b、ProjectsView类直接继承ListCreateAPIView类
c、由于父类给我们提供了ListCreateAPIView类,直接继承就可以,不需要我们去定义。
4、对抽取获取详细的数据逻辑、抽取更新数据逻辑,抽取删除数据逻辑进行优化,同上面的一个道理
由于父类给我们提供了RetrieveUpdateDestroyAPIView类,直接继承就可以,不需要我们去定义。
5、优化后的代码如下
6、综合后的代码如下
二、Mixin拓展类
1、直接继承Mixin拓展类,Mixin拓展类只提供了action方法
2、action方法有哪些?
list ——》获取列表数据
retrieve ——》获取详细数据
create ——》创建数据
update ——》更新数据(完整更新)
partial update ——》更新数据(部分更新)
destrov ——》删除数据
3、困难:类视图往往只能识别如下方法,一个类中不能有2个相同的方法
get ——》list
get——》retrieve
post——》create
put——》update
patch——》partial_update
delete——》destroy
4、为了进一步优化代码,需要使用具体的通用视图XXXAPIView
5、视图集:根据请求方法自动调用action方法
6、可以继承视图集父类(viewsets.ViewSet)
在定义url路由条目时,支持给as_view传递字典参数(请求方法名)
7、ViewSet继承了ViewSetMixin, views.APIView,
继承views.APIView具备APIView的所有功能
继承ViewSetMixin具备了给as_view传递字典参数,将HTTP请求与action方法进行一一绑定
例如下图演示:
8、这块父类有提供,不需要我们自己去定义
9、继承父类后,代码如下图所示:
此时访问接口时会报错,‘ProjectViewSet’没有找到’filter_queryset’,
filter_queryset在GenericAPIView类中,所以要继承GenericAPIView才会成功。GenericAPIView在哪?
下图所示:在GenericViewSet中,
10、再次优化
11、终极优化:
父类有提供ModelViewSet类(mixins.ListModelMixin,
mixins.CreateModelMixin,
mixins.UpdateModelMixin,
mixins.RetrieveModelMixin,
mixins.DestroyModelMixin,
viewsets.GenericViewSet),
直接继承ModelViewSet:
a、ModelViewSet是一个最完整的视图集类
b、提供了获取列表数据接口、获取详情数据接口、创建数据接口、更新数据接口、删除数据接口
c、如果需要对某个模型进行增删改查操作才使用ModelViewSet
d、如果仅仅只对某个模型进行数据读取操作(获取列表数据接口、获取详情数据接口)一般使用ReadOnlyModelViewSet。