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, ...
随机推荐
- Codeforces Round #438 by Sberbank and Barcelona Bootcamp (Div. 1 + Div. 2 combine
最近只想喊666,因为我是真得菜,大晚上到网吧打代码还是很不错的嘛 A. Bark to Unlock time limit per test 2 seconds memory limit per t ...
- Codeforces Round #305 (Div. 2) D. Mike and Feet
D. Mike and Feet time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- phpstorm 修改头部注释
点击“setting”->"File Templates" ->"PHP File Header"
- DDLog-不同颜色打印信息
(一)下载安装 1.安装插件 XcodeColors Github 链接:https://github.com/robbiehanson/XcodeColors 打开XcodeColors项目,编译即 ...
- Codeforces Round Rockethon 2015
A. Game 题目大意:A有N1个球,B有N2个球,A每次可以扔1-K1个球,B每次可以扔1-K2个球,谁先不能操作谁熟 思路:.....显然每次扔一个球最优.... #include<ios ...
- ndarray:一种多维数组对象
ndarray是一个通用的同构数据多维容器,也就是说,其中的所有元素必须是相同类型的.每个数组都有一个shape(一个表示各维度大小的元组)和一个dtype(一个用于说明数组数据类型的对象). In ...
- 牛客练习赛1 矩阵 字符串二维hash+二分
题目 https://ac.nowcoder.com/acm/contest/2?&headNav=www#question 解析 我们对矩阵进行二维hash,所以每个子矩阵都有一个额hash ...
- oracle学习笔记(十四) 数据库对象 索引 视图 序列 同义词
数据库对象 用户模式:指数据库用户所创建和存储数据对象的统称.在访问其它用户模式的数据库对象时需加上用户模式. 如:scott.emp, scott.dept等. 数据库对象包括:表.视图.索引.序列 ...
- codevs——1228 苹果树
1228 苹果树 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 在卡卡的房子外面,有一棵 ...
- ClassLoader Java中类加载出现在哪个阶段,编译期和运行期? 类加载和类装载是一样的吗
1.ClassLoader Java中类加载出现在哪个阶段,编译期和运行期? 类加载和类装载是一样的吗? :当然是运行期间啊,我自己有个理解误区,改正后如下:编译期间编译器是不去加载类的,只负责编译而 ...