DRF之视图组件 三次封装
1、为什么要进行封装
1.1 在处理表的时候,如果有几十张表都需要增删改查查时,如果每一张表都写这些方法,会让代码显得冗余,所以需要将这些方法进行封装,然后不同的表都去继承这写方法。(这是思路)
1.2 分析需要自定义的内容
1.2.1 获取到的对象,根据不同的表结构,获取不同的对象内容,比如book_obj , publiser_obj, authors_obj 等等。
所以 这些 quser_set = None ,到时候根据不同的表去继承。
1.2.2 序列化器也不同,所以需要serilizer_class = None
1.2.3 定义一个通用的类,来让其他类继承
2、第一次封装
2.1 定义一个通用的类
class GenericAPIView(APIView):
queryset = None
serializer_class = None def get_queryset(self): # 定义get_queryset方法固定写法get_属性名
return self.queryset.all() # 这个self也是BookView的实例化对象 def get_serializer(self, *args, **kwargs): # 定义一个返回序列化器的类对象的方法,序列化器的参数不同所以用*args 和 **kwargs
return self.serializer_class(*args, **kwargs) # 直接返回类的实例化对象
# 其他类继承她的时候,获取的对象就可以通过self.get_queryset() 或 self.serlializer()来获取
2.2 将get,post,put,delete等请求方法抽离出来
class ListModelMixin(object): # list 对应 GET 请求 ,全部查找
def list(self, request):
queryset = self.get_queryset() # 这个self 也是BookView的实例化对象
ser_obj = self.get_serializer(queryset, many=True)
return Response(ser_obj.data) class CreateModelMixin(object): # create 对应 POST 请求
def create(self, request):
ser_obj = self.get_serializer(data=request.data)
if ser_obj.is_valid():
ser_obj.save()
return Response(ser_obj.validated_data)
return Response(ser_obj.errors) class RetrieveModelMixin(object): # retrieve 对应 GET 请求中的有id 的,单条查找
def retrieve(self, request, id):
book_obj = self.get_queryset().filter(id=id).first()
ser_obj = BookSerializer(book_obj)
return Response(ser_obj.data) class UpdateModelMixin(object): # update 对应 PUT 请求
def update(self, request, id):
book_obj = self.get_queryset().filter(id=id).first()
ser_obj = self.get_serializer(instance=book_obj, data=request.data, partial=True)
if ser_obj.is_valid():
ser_obj.save()
return Response(ser_obj.validated_data)
return Response(ser_obj.errors) class DestroyModelMixin(object): # destory 对应 DELETE 请求
def destroy(self, request, id):
book_obj = self.get_queryset().filter(id=id).first()
if not book_obj:
return Response("删除的对象不存在")
book_obj.delete()
return Response("")
2.3、调用
class BookView(GenericAPIView, ListModelMixin, CreateModelMixin):
queryset = Book.objects.all()
serializer_class = BookSerializer
def get(self, request): return self.list(request) # 此时的self 是BookView的实例化对象,找list方法,自己没有去父类找,在ListModelMixin找到之后,继续找get_queryset和get_serializer,
# 没有去GenericAPIView找。找到之后乡下执行,返回ser_obj.data def post(self, request):
return self.create(request)
3、第二期封装
3.1二次封装目的就是为了对继承进行了一个整合,方便继承。将BookView中继承的类,让一个新的类去继承,然后自己去继承这个新的类
# 创建一个新的类ListCreateAPIView,让他继承应该继承的类,然后写个pass,不写任何逻辑,只为让BookView继承
class ListCreateAPIView(GenericAPIView, ListModelMixin, CreateModelMixin):
pass
3.2调用
class BookView(ListCreateAPIView): # 继承新类
queryset = Book.objects.all()
serializer_class = BookSerializer def get(self, request):
return self.list(request) def post(self, request):
return self.create(request)
4、第三次封装
4.1 应用理由 ,目的是为了将视图进行合并,用一个视图去解决,在第三次封装前,视图有两个,如图



4.2 应用场景:重写admin的时候,会用到,一般用不到
4.3 应用步骤:
4.3.1 想在url中传参,所以需要重写as_view方法。APIView中的as_view是不允许传参的,会报错。
4.3.2 自定义一个CBV ,ModelViewSet,让他继承ViewSetMixin,因为ViewSetMinix类中,重写了as_view方法,允许传参了
ViewSetMinix把get/post/put等请求 对应成了 list/create/update 这种对应关系,所以在dispath分发的时候,就变成了get ===> self.list

4.3.3 在views中重新写一个CBV,BookModelView 继承ModelViewSet

4.3.4 在urls中给路由传参数,写好对应关系,现在就是一个BookModelView视图

DRF之视图组件 三次封装的更多相关文章
- DRF的视图组件
目录 DRF的视图组件 两大视图类 六大视图工具类 九大工具视图类 两大视图集基类 DRF的视图组件 DRF的视图组件大概分以下几类 两大视图类 APIView.GenericAPIView from ...
- DRF之视图组件
不断的优化我们写的程序,是每个程序员必备的技能和职业素养,也是帮助我们成长的非常重要的手段. 使用serializer进行put接口设计 根据规范,PUT接口用来定义用户对数据修改的逻辑,也就是upd ...
- DjangoRestFramework学习二之序列化组件、视图组件 serializer modelserializer
DjangoRestFramework学习二之序列化组件.视图组件 本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组 ...
- day 88 DjangoRestFramework学习二之序列化组件、视图组件
DjangoRestFramework学习二之序列化组件.视图组件 本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组件 ...
- DRF(5) - 频率组件、url注册器、响应器、分页器
一.频率组件 1.使用DRF简单频率控制实现对用户进行访问频率控制 1)导入模块,定义频率类并继承SimpleRateThrottle # 导入模块 from rest_framework.throt ...
- DjangoRestFramework学习二之序列化组件、视图组件
本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组件 首先按照restful规范咱们创建一些api接口,按照下面这些形式写吧: ...
- DRF 视图组件,路由组件
视图组件 -- 第一次封装 -- GenericAPIView(APIView): queryset = None serializer_class = None def ge ...
- DRF(3) - 序列化组件(GET/PUT/DELETE接口设计)、视图优化组件
一.序列化组件 基于上篇随笔的表结构,通过序列化组件的ModelSerializer设计如下三个接口: GET 127.0.0.1:8000/books/{id} # 获取一条数据,返回值:{} PU ...
- 【DRF框架】视图组件
基于mixins视图类 from rest_framework import mixins # 创建视图 class CreateModelMixin(object) def create(self, ...
随机推荐
- 【drp 12】再识转发和重定向:SpringMVC无法跳转页面
最近再使用SpringMVC进行页面跳转的时候,不知道发生了什么,始终都无法正确跳转.后来问题解决了,发现是对于转发和重定向没有能很好的理解,以此写篇博客,权当做积累了! 声明:本博客的所有代码,均为 ...
- HDU-5536 Chip Factory,又见字典树,好题+1!
Chip Factory 题意:一个n个数的数列,求三个数其中两个数的和与另外一个数的异或值最大,输出这个最大值. 思路:和前面那个百度之星资格赛HDU4825的类似,多了两个过程,一个是枚举和,另一 ...
- ajax 原生 post
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- element-ul InputNumber 空白
if(this.days == undefined){ this.$nextTick(function(){ this.days = 1; }); }
- BZOJ 3831: [Poi2014]Little Bird【动态规划】
Description In the Byteotian Line Forest there are trees in a row. On top of the first one, there ...
- 北京集训TEST16——图片加密(fft+kmp)
题目: Description CJB天天要跟妹子聊天,可是他对微信的加密算法表示担心:“微信这种加密算法,早就过时了,我发明的加密算法早已风靡全球,安全性天下第一!” CJB是这样加密的:设CJB想 ...
- 刷题总结——鸭舌(ssoi)
题目: 题目背景 CF 77C 题目描述 小美喜欢吃鸭舌.有一个 n 个点的树,每个节点 i ,第 i 个点上有 ai 个鸭舌.小美一开始处于 x 号点.每次小美可以选择一个与现在的点有边的点而且那个 ...
- 类 this指针 const成员函数 std::string isbn() const {return bookNo;}
转载:http://www.cnblogs.com/little-sjq/p/9fed5450f45316cf35f4b1c17f2f6361.html C++ Primer 第07章 类 7.1.2 ...
- 济南学习 Day 5 T2 pm
逆欧拉函数(arc)题目描述:已知phi(N),求N.输入说明:两个正整数,分别表示phi(N)和K.输出说明:按升序输出满足条件的最小的K个N.样例输入:8 4杨丽输出:15 16 20 24数据范 ...
- Oracle命令行创建数据库
创建数据库文件 CREATE TABLESPACE MyDataBase LOGGING DATAFILE 'D:\Oracle\database\MyDataBase.dbf' SIZE 100M ...