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, ...
随机推荐
- Ubuntu Software Center has closed unexpectly解决方案
打开软件中心Ubuntu Software Center的时候 出现crash report :The application Ubuntu Software Center has closed un ...
- 【java基础 11】java集合框架学习
导读:本篇博客主要是从整体上了解java的集合框架,然后主要介绍几个自己在项目中用到的结构,比如说:hashtable.hashmap.hashset.arraylist等! 一.宏观预览 从宏观上看 ...
- 使用Unity做2.5D游戏教程(一)
最近在研究Unity 3D,看了老外Marin Todorov写的教程很详细,就翻译过来以便自己参考,翻译不好的地方请多包涵. 如果你不了解2.5D游戏是什么,它基本上是个3D游戏而你可以想象是压扁的 ...
- Failed building wheel for Twisted
在安装scrapy框架的过程中,pip install scrapy 出现报错信息: building 'twisted.test.raiser' extension error: Microsoft ...
- poj 3304 判断是否存在一条直线与所有线段相交
Segments Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8579 Accepted: 2608 Descript ...
- BZOJ1902: Zju2116 Christopher
$n \leq 10^{100}$,问$C_n^m,0<=m<=n$有多少是质数$p \leq 1e7$的倍数. 一样,套高精度的题,只有战胜他才能鄙视他. 但是我TM被他鄙视了一上午!! ...
- yii 之数据库关联查询
<?php namespace app\controllers; use yii\web\Controller; use app\models\Customer; class CustomerC ...
- asp.net开发的调试方法集合
调试是写代码一共非常重要的步骤,掌握好调试的技巧对于编程有事半功倍的效果,下面是我总结的菜鸟用方法 1.关于HTML和JS的调试 JS曾经是我最讨厌的错误,因为大多数错误VS不报错,这是因为js是解释 ...
- AC日记——栈 洛谷 P1044
题目背景 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表. 栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈). 栈的重要性不言自明,任何 ...
- Spring 详解(二)------- AOP关键概念以及两种实现方式
目录 1. AOP 关键词 2. AOP 的作用 3. AOP 的通知类型 4. 基于 xml 的配置方式 5. 基于注解的配置方式 6. 切面的优先级 7. 重用切点表达式 8. 两种方式的比较(摘 ...