DRF—Mixin拓展类、视图集

本文介绍了如何通过Mixin类优化Python项目中的CRUD操作,如ListModelMixin、CreateModelMixin的使用,以及如何利用ModelViewSet实现全面的API接口设计,减少重复代码,提高开发效率。
摘要由CSDN通过智能技术生成

在这里插入图片描述

一、优化代码

上面的代码为项目的获取、更新、查找、创建、删除操作,当我变为用例的获取、更新、查找、创建、删除操作时,只需要改变这些代码:
在这里插入图片描述
针对上面的代码进行优化,
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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码敲到头发茂密

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值