当前位置:网站首页>第十三单元 混入视图基类
第十三单元 混入视图基类
2022-08-02 14:01:00 【czy1206527605】
一.GenericAPIView
1.是什么
GenericAPIView继承自 APIVIew,对于增删查改操作进行了一个简化。
使用前要先导入:
from rest_framework.generics import GenericAPIView
2.内部属性
列表、详情视图通用属性
queryset=objects.all.filter.order_by
列表视图要操作的查询结果对象
serializer_class=Serializer
视图中会使用到的序列化器,一般都是针对于上一个queryset所指定的
列表视图单独属性
pagination_clas
分页控制类,进行分页设置
filter_backends
过滤控制后端,可以对数据进行字段过滤
详情页视图单独属性
lookup_url_kwarg
动态路由传递的参数命名
lookup_field
过滤的orm参数
列表与详情视图通用方法
get_queryset(self)
返回视图使用的查询集,是列表视图与详情视图获取数据的基础
默认返回queryset属性,支持重写
get_serializer_class(self)
返回序列化器类,默认返回serializer_class,可以重写
get_serializer(self, args, kwargs)
返回序列化器对象
详情页视图单独方法
get_object(self)
返回详情视图所需的模型类数据对象,默认使用lookup_field参数来过滤queryset。 在试图中可以调用该方法获取详情信息的模型类对象
若详情访问的模型类对象不存在,会返回404,如果访问到多个重复,也会报错,默认使用get方法进行orm查询
该方法会默认使用 APIView 提供的check_object_permissions方法检查当前对象是否有权限被访问
3.使用GenericAPIView实现增删查改
导入导包
from rest_framework.generics import GenericAPIView
代码讲解
class PeopleView(GenericAPIView):
# 1.指定查询结果集
queryset = People.objects.all()
# 2.指定序列化器
serializer_class = PeopleSerializer2
# 查询所有人物信息
def get(self,request):
people = GenericAPIView.get_queryset(self)
# people是要序列化的数据,many=true多个数据
# 使用序列化器 对数据进行序列化
ser = GenericAPIView.get_serializer(self,instance=people,many=True)
# 注意:返回的是.data
return Response(ser.data,status=200)
# 增加一个人物信息 反序列化 json->ORM格式数据
def post(self,request):
# 使用序列化器进行反序列化,data=request.data要反序列化的数据
ser = GenericAPIView.get_serializer(self,data=request.data)
# 判断反序列化是否成功
# raise_exception=True如果出现异常会抛出异常
if ser.is_valid(raise_exception=True):
# 保存
ser.save()
# 201添加或修改成功
return Response({'msg':'success'},status=201)
return Response({'msg':'error'},status=400)
class PeopleView2(GenericAPIView):
# 查询一个人物信息
# 1.指定查询结果集
queryset = People.objects.all()
# 2.指定序列化器
serializer_class = PeopleSerializer2
# 3. 指定动态参数
lookup_url_kwarg = 'id'
# 4.指定过滤的ORM字段
lookup_field = 'id'
def get(self,reqeust,id):
try:
peo_data = GenericAPIView.get_object(self)
except Exception as e:
print(e)
# 404数据不存在
return Response({'msg':'error'},status=404)
# 对ORm操作查询到的数据进行序列化 单条数据无需加many = true
ser = GenericAPIView.get_serializer(self,peo_data)
return Response(ser.data,status=200)
# 修改一个人物信息
def put(self,request,id):
try:
peo_data = GenericAPIView.get_object(self)
except Exception as e:
print(e)
# 404数据不存在
return Response({'msg': 'error'}, status=404)
# 对要更新的数据进行 反序列化
# instance=peo_data,要修改的ORM对象(实例)
# data = request.data.用于修改ORM对象的数据
ser = GenericAPIView.get_serializer(self,instance=peo_data,data=request.data)
# 判断反序列化是否成功
if ser.is_valid(raise_exception=True):
# 保存
ser.save()
# 201添加,修改 成功
return Response({'msg': 'success'}, status=201)
return Response({'msg': 'error'}, status=500)
# 删除一个人物信息
def delete(self,request,id):
try:
GenericAPIView.get_object(self).delete()
except Exception as e:
print(e)
# 404数据不存在
return Response({'msg':'error'},status=404)
# 204表示删除成功
return Response({'msg':'success'},status=204)
二.混入类功能的划分
图解
1.混入类功能划分
ListModelMixin
查询全部数据
CreateModelMixin
创建一条数据
RetrieveModelMixin
对单个数据进行查询
UpdateModelMixin
修改数据对象
DestroyModelMixin
删除一个存在的数据对象
2.GenericAPIView 和混入类配合使用,实现增删改查操作
导入
from rest_framework.mixins import ListModelMixin,CreateModelMixin,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin
from rest_framework.generics import GenericAPIView
代码讲解
from rest_framework.mixins import ListModelMixin,CreateModelMixin,\
RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin
class PeopleView(GenericAPIView,ListModelMixin,CreateModelMixin):
# 1.指定查询结果集
queryset = People.objects.all()
# 2.指定序列化器
serializer_class = PeopleSerializer2
# 查询所有人物信息
def get(self,request):
return self.list(request)
# 增加一个人物信息 反序列化 json->ORM格式数据
def post(self,request):
return self.create(request)
class PeopleView2(GenericAPIView,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin):
# 查询一个人物信息
# 1.指定查询结果集
queryset = People.objects.all()
# 2.指定序列化器
serializer_class = PeopleSerializer2
# 3. 指定动态参数
lookup_url_kwarg = 'id'
# 4.指定过滤的ORM字段
lookup_field = 'id'
# 查询一个人的信息
def get(self,reqeust,id):
return self.retrieve(reqeust)
# 修改一个人物信息
def put(self,request,id):
return self.update(request)
# 删除一个人物信息
def delete(self,request,id):
return self.destroy(request)
三.拓展类的应用
1.拓展类的划分
CreateAPIView
- 提供post方法,可以创建一条数据
继承自:GenericAPIView、CreateModelMixin
ListAPIView
- 提供get方法,可以获取多条数据
继承自:GenericAPIView、ListModelMixin
RetireveAPIView
- 提供get方法,获取某个具体数据的详情
继承自:GenericAPIView、RetrieveModelMixin
DestoryAPIView
提供 delete 方法,可以删除某条存在数据
继承自:GenericAPIView、DestoryModelMixin
UpdateAPIView
- 提供 put 和 patch 方法,可以更新或者局部更新某条数据
继承自:GenericAPIView、UpdateModelMixin
ListCreateAPIView
- 提供 post 和 get 方法,可以创建一条数据,或获取列表数据
继承自:GenericAPIView、CreateModelMixin、ListModelMixin
RetrieveUpdateAPIView
- 提供 get、put、patch 方法,可以获取一条数据详情,也可以更新一条数据
继承自:GenericAPIView、RetrieveModelMixin、UpdateModelMixin
RetrieveDestroyAPIView
- 提供 get 和 delete 方法,可以获取和删除一条已存在数据
继承自:GenericAPIView、RetrieveModelMixin、DestoryModelMixin
RetrieveUpdateDestoryAPIView
- 提供 get、put、patch、delete 方法,啥也能干
继承自:GenericAPIView、RetrieveModelMixin、UpdateModelMixin、DestoryModelMixin
2.使用拓展类实现增删查改
GenericAPIView 和混入类配合使用,实现增删改查操作
导入
from rest_framework.generics import ListCreateAPIView,RetrieveUpdateDestroyAPIView
代码讲解
class PeopleView(ListCreateAPIView):
# 1.指定查询结果集
queryset = People.objects.all()
# 2.指定序列化器
serializer_class = PeopleSerializer2
# 查询所有人物信息
# 增加一个人物信息 反序列化 json->ORM格式数据
class PeopleView2(RetrieveUpdateDestroyAPIView):
# 查询一个人物信息
# 1.指定查询结果集
queryset = People.objects.all()
# 2.指定序列化器
serializer_class = PeopleSerializer2
# 可有可无(在url中,如果这个不写的话要把<int:id>的id改为pk)
# # 3. 指定动态参数
# lookup_url_kwarg = 'id'
# # 4.指定过滤的ORM字段
# lookup_field = 'id'
# 查询一个人的信息
# 修改一个人物信息
# 删除一个人物信息
边栏推荐
- RowBounds[通俗易懂]
- A number of embassies and consulates abroad have issued reminders about travel to China, personal and property safety
- 关于市场后市的发展预测? 2021-05-23
- Sentinel源码(六)ParamFlowSlot热点参数限流
- 面试官:可以谈谈乐观锁和悲观锁吗
- drf序列化器-Serializer
- drf路由组件Routers
- 网络安全第三次作业
- Detailed explanation of ORACLE expdp/impdp
- drf源码分析与全局捕获异常
猜你喜欢
Sentinel源码(六)ParamFlowSlot热点参数限流
IDEA打包jar包
Some impressions of the 519 plummet 2021-05-21
此次519暴跌的几点感触 2021-05-21
栈 && 队列
动态刷新日志级别
How to solve mysql service cannot start 1069
世界上最大的开源基金会 Apache 是如何运作的?
About the development forecast of the market outlook?2021-05-23
第二届中国Rust开发者大会(RustChinaConf 2021~2022)线上大会正式开启报名
随机推荐
网络安全第四次作业
一维卷积神经网络_卷积神经网络的基础知识「建议收藏」
乐心湖‘s Blog——MySQL入门到精通 —— 囊括 MySQL 入门 以及 SQL 语句优化 —— 索引原理 —— 性能分析 —— 存储引擎特点以及选择 —— 面试题
Large and comprehensive pom file example
RKMPP库快速上手--(一)RKMPP功能及使用详解
大而全的pom文件示例
els strip collision deformation judgment
Flutter 实现光影变换的立体旋转效果
What is the difference between web testing and app testing?
Flask项目的完整创建 七牛云与容联云
配置zabbix自动发现和自动注册。
软件测试和硬件测试的区别及概念
Interviewer: Can you talk about optimistic locking and pessimistic locking?
redis延时队列
CVE-2020-27986 (Sonarqube sensitive information leak) vulnerability fix
Raft协议图解,缺陷以及优化
Raft对比ZAB协议
HALCON: 对象(object)从声明(declaration)到结束(finalization)
How to solve 1045 cannot log in to mysql server
Cloin 控制台乱码