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方法中的查询所有数据和查询单一数据。

 

posted @   EricYJChung  阅读(494)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示