DRF框架--view,viewset详解
视图的作用
Django中的 "视图" 是用来封装处理用户请求并返回响应的逻辑函数结果.
视图是一个可调用对象,它不仅可以基于函数,也可以基于类,FBV和CBV
相比较函数视图(FBV),类视图(CBV)的区别和优势:
-
默认自动dispatch特定的HTTP方法,比如GET,POST等,不需要像函数视图一样通过单独的条件判断来处理
-
面向对象的技术比如Mixin(多继承,混用)等可以在类视图中使用,从而可以将代码拆解成可复用的组件
视图函数:
def my_view(request): if request.method == 'GET': # <逻辑> return HttpResponse('result')
视图类:
class MyView(View): def get(self, request): # <view logic> return HttpResponse('result')
View与APIView
django中的View:
所有基于类的view的父类,它负责将视图连接到URL,HTTP方法调度分发(GET,POST等),以及其他简单的功能
APIView:
APIView是DRF中所有view的父类,APIView会对浏览器过来的request进行重新封装,加了一些额外的属性和参数,APIView本身同样继承与Django的View,但是做了较大程度的扩展
APIView与View的不同之处在于:
- 传入到视图方法中的事REST framework的Request对象,而不是Django中的HttpRequest对象;
- 视图方法可以返回REST framework的Response对象,视图会为响应数据设置(render)符合前端要求的数据格式;
- 任何APIException异常都会被捕获到,并且处理成合适的响应信息
- 在进行dispatch()分发前,会对请求进行身份认证,权限检查,流量控制
支持定义的属性:
- authentication_classes 列表或元组,身份认证类
- peimission_classes 列表或元组,权限检查类
- throttle_classes 列表或元组,流量控制类
APIView依然需要手动按 自己操作序列化器和数据库,按照两个类视图,写增删改查的代码
在APIView中,仍然以常规的类视图方法来实现get(),post()或者其他请求方式的方法
GenericAPIView:
GenericAPIView继承自APIView,不同的是,GenericAPIView增加了操作序列化器和数据库查询的方法,作用是为下面Mixin扩展类的执行提供方法支持,通常在使用时,可搭配一个或多个Mixin扩展类.
GenericAPIView 依然需要手动 两个类视图,写增删改查的代码, 但简化了操作序列化器和数据库查询的方法
GenericAPIView结合各种扩展类,才能减少增删改查的代码.
GenericAPIView结合Set,才能两个类视图变成一个类事视图
1) 提供的关于序列化器使用的属性和方法:
属性:
serializer_class 指明视图使用的序列化器
方法:
get_serializer_class(self) 返回序列化器类,默认返回serializer_class,可以重写
def get_serializer_class(self): if self.request.user.is_staff: return FullAccountSerializer return BasicAccountSerializer
get_serializer(self,args,*kwargs) 返回序列化器对象,主要用来提供非Mixin扩展类使用,如果我们在视图中想要获取序列化器,可以直接调用此方法
注意:该方法在提供序列化器对象的时候,会向序列化器对象的context属性补充三个数据:request,format,view,这三个数据对象可以在定义序列化器时使用.
- request 当前视图的请求对象
- view 当前请求的类视图对象
- format 当前请求期望返回的数据格式
2) 提供的关于数据库查询的属性与方法:
属性:
queryset 指明使用的数据查询集
方法:
get_queryset(self) 返回视图使用的查询集,主要用来提供给Mixin扩展类使用,是列表视图与详情视图获取数据的基础,默认返回queryset属性,可以重写
def get_queryset(self) user = self.request.user return user.accounts.all()
get_object(self) 返回详情视图所需的模型类数据对象,主要用来提供给Mixin扩展类使用.在视图中可以调用该方法获取详情信息的模型类对象.该方法会默认使用APIView提供的check_object_permissions方法检查当前对象是否有权限被访问.
class BookDetailView(GenericAPIView): queryset = BookInfo.objects.all() serializer_class = BookInfoSerializer def get(self,request,pk): book = self.get_object() # get_object()方法根据pk参数查找queryset中的数据对象 serializer = self.get_serializer(book) return Response(serializer.data)
pagination_class 指明分页控制类
filter_backends 指明过滤控制后端
set的作用是将两个类合成一个类
generic的作用是提供了操作数据库和操作序列化器的方法,即 get_object,get_queryset,get_serializer_class,get_serializer的方法
常用视图集父类
1) ViewSet
继承自APIView
,作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。
在ViewSet中,没有提供任何动作action方法,需要我们自己实现action方法。
2)GenericViewSet
继承自GenericAPIView
,作用也与GenericAPIVIew类似,提供了get_object、get_queryset等方法便于列表视图与详情信息视图的开发。
在GenericViewSet中,需要我们自己实现action方法。
3)ModelViewSet
继承自GenericAPIVIew
,同时包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。
在ModelViewSet中,不需要我们自己实现action方法。
4)ReadOnlyModelViewSet
继承自GenericAPIVIew
,同时包括了ListModelMixin、RetrieveModelMixin。
在ReadOnlyModelViewSet中,不需要我们自己实现action方法中的查询所有数据和查询单一数据。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通