DRF的View

在这里插入图片描述

简介

DRF中的View分成 三个等级,最基本的View,APIView,到GenericAPIView,再到GenericViewSet

APIViewViewsetDRF 中引入的视图类,ViewsetDRF 自身提供的 APIView 进行了再次封装,而 APIView 是对原生 Django View 的封装,灵活运用 APIViewViewset 可以大幅度提升业务开发效率,且大大提升了代码的可维护性。

继承关系

View
    APIView
        ViewSet
        GenericAPIView
            GenericViewSet
                ReadOnlyModelViewSet
                ModelViewSet
            ListAPIView
            RetrieveAPIView
            CreateAPIView
            UpdateAPIView
            DestroyAPIView
            ListCreateAPIView
            RetrieveUpdateAPIView
            RetrieveDestoryAPIView
            RetrieveUpdateDestoryAPIView

View

来自Django原生中,是基于所有类的View的父类,它负责将视图连接到URL,HTTP方法调度(POST,GET)和其他简单的功能。

APIView

APIView 是 DRF 中所有view的父类,本身继承于Django的view,只有简单的调度方法和检查。
最直接封装的是对request,response都进行了封装,response里面做了一些认证,权限,限流之类处理。而response返回的结果是经过系列化的json.

与django中的view类似的是,APIView中只需要实现对应的方法如 get, post等。

class ArticleView(APIView):
    def get(self, request, *args, **kwargs):
        # 取数据
        pass
    def post(self, request, *args, **kwargs):
        # 增加数据
        pass
    def put(self, request, *args, **kwargs):
        # 全局更新
        pass
    def patch(self, request, *args, **kwargs):
        # 局部更新
        pass
    def delete(self, request, *args, **kwargs):
        # 删除
        pass

GenricAPIView

这里都是通用的APIView,所谓通用就是常用的增删改查,也就是restframework已经帮你封装好了。比如django的GenericView封装了ListView, DetailView,CreateView, UpdateView, DeleteView等通用视图类。drf中则封装得更多。

下面 分别看一下源码:

CreateAPIView
实现了post方法

class CreateAPIView(mixins.CreateModelMixin,
                    GenericAPIView):
    """
    Concrete view for creating a model instance.
    """
    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

ListAPIView
实现get方法

class ListAPIView(mixins.ListModelMixin,
                  GenericAPIView):
    """
    Concrete view for listing a queryset.
    """
    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

RetrieveAPIView
实现get方法,它与ListAPIView的不同是它获取单个对象,类似于django中的DetailView

class RetrieveAPIView(mixins.RetrieveModelMixin,
                      GenericAPIView):
    """
    Concrete view for retrieving a model instance.
    """
    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)

DestroyAPIView
实现delete方法

class DestroyAPIView(mixins.DestroyModelMixin,
                     GenericAPIView):
    """
    Concrete view for deleting a model instance.
    """
    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)

UpdateAPIView
实现了put,patch两个方法,分别对应全局和局部更新。

class UpdateAPIView(mixins.UpdateModelMixin,
                    GenericAPIView):
    """
    Concrete view for updating a model instance.
    """
    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

    def patch(self, request, *args, **kwargs):
        return self.partial_update(request, *args, **kwargs)

下面则是一些组合的视图类
… 详情参考: 这篇文章

ViewSet

ViewSet 继承了APIView 之外,还加入了 .as_view().initialize_request(),并可以结合 router 映射路由

三者的不同

三者之间最重要的不同在于 mixin

APIView 和 View

在APIView中仍以常规的类视图定义方法来实现get() 、post() 或者其他请求方式的方法
新增的自定义属性

  • authentication_classes 列表或元祖,身份认证类
  • permissoin_classes 列表或元祖,权限检查类
  • throttle_classes 列表或元祖,流量控制类

请求和返回使用的 DRF 的Request Response而不是django的HttpRequest HttpResponse
请求传入时进行身份验证,并在传给处理方法前进行权限检验
任何APIException都会被捕捉并放入合适的想要中
response返回的内容需是序列化的json

GenericAPIView 和 APIView

GenericAPIView 继承于 APIView

GenericAPIView新加的配置项

  • 【列表视图】与【详情视图】通用

    • queryset 指定作用的 model 数据范围【如果设置了 get_queryset() 这个配置则不生效】
    • serializer_class 设置视图使用的 serializer
  • 【列表视图】使用

    • pagination_class 设置分页
    • filter_backends 设置过滤
  • 【详情页视图】使用

    • lookup_field 查询单一数据库对象时使用的条件字段,默认为’pk’
    • lookup_url_kwarg 查询单一数据时URL中的参数关键字名称,默认与look_field相同

GenericAPIView新加的方法

  • get_queryset()
    【列表视图与详情视图通用】
    返回视图使用的查询集,是列表视图与详情视图获取数据的基础,默认返回queryset属性,可以重写,例如:
def get_queryset(self):
    user = self.request.user
    return user.accounts.all()
  • get_serializer_class()
    【列表视图与详情视图通用】
    返回序列化器类,默认返回serializer_class,可以重写,例如:
def get_serializer_class(self):
    if self.request.user.is_staff:
        return FullAccountSerializer
    return BasicAccountSerializer
  • get_serializer(self, args, *kwargs)
    【列表视图与详情视图通用】
    返回序列化器对象,被其他视图或扩展类使用,如果我们在视图中想要获取序列化器对象,可以直接调用此方法。
    注意,在提供序列化器对象的时候,REST framework会向对象的context属性补充三个数据:request、format、view,这三个数据对象可以在定义序列化器时使用。

  • get_object()
    【详情视图使用】
    返回详情视图所需的模型类数据对象,默认使用lookup_field参数来过滤queryset。
    在试图中可以调用该方法获取详情信息的模型类对象。
    若详情访问的模型类对象不存在,会返回404。
    该方法会默认使用APIView提供的check_object_permissions方法检查当前对象是否有权限被访问。

# url(r'^books/(?P<pk>\d+)/$', views.BookDetailView.as_view()),
class BookDetailView(GenericAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer
 
    def get(self, request, pk):
        book = self.get_object()
        serializer = self.get_serializer(book)
        return Response(serializer.data)
  • get_serializer_context()
  • filter_queryset()
   GenericAPIView 可组合的 mixin
       mixins.CreateModelMixin
       mixins.ListModelMixin
       mixins.RetrieveModelMixin
       mixins.UpdateModelMixin
       mixins.DestroyModelMixin
   
   GenericAPIView 已经组合的 mixin (与GenericAPIView放在同一目录)
       CreateAPIView = GenericAPIView + mixins.CreateModelMixin (POST 有 create 方法)
       ListAPIView = GenericAPIView + mixins.ListModelMixin (GET 有 list 方法)
       RetrieveAPIView = GenericAPIView + mixins.RetrieveModelMixin (GET 有 retrieve 方法)
       DestroyAPIView = GenericAPIView + mixins.DestroyModelMixin
       UpdateAPIView = GenericAPIView + mixins.UpdateModelMixin
       ListCreateAPIView = GenericAPIView + mixins.ListModelMixin + mixins.CreateModelMixin
       RetrieveUpdateAPIView = GenericAPIView + mixins.RetrieveModelMixin + mixins.UpdateModelMixin
       RetrieveDestroyAPIView = GenericAPIView + mixins.RetrieveModelMixin + mixins.DestroyModelMixin
       RetrieveUpdateDestroyAPIView = GenericAPIView + mixins.RetrieveModelMixin + mixins.DestroyModelMixin + mixins.DestroyModelMixin

ViewSet 和 APIView

ViewSet 和 APIView 的区别:

ViewSet 继承于 APIView 的同时,多了一个 ViewSetMixin
ViewSetMixin 多了一个 .as_view() 方法,可将 get、post 等绑定到指定方法上
ViewSet 需要借助 router 实现配置 url
ViewSetMixin 还多了一个 .initialize_request()
initialize_request 给 request 绑定了很多的 action,主要用于动态的 serializers

GenericViewSet 和 ViewSet

ViewSet 继承于 APIView
GenericViewSet 继承于 GenericAPIView

GenericViewSet 已经组合的 mixin (与 GenericViewSet 放在同一目录)

    ReadOnlyModelViewSet = GenericViewSet + mixins.RetrieveModelMixin + mixins.ListModelMixin
    ModelViewSet = GenericViewSet + mixins.CreateModelMixin + mixins.RetrieveModelMixin + UpdateModelMixin + mixins.DestroyModelMixin + mixins.ListModelMixin

Viewsets包含的Class(常用的)

0.ViewSetMixin
简介:Viewset的基类,它重写了原来 django view 中 .as_view() 方法,使得注册Url变得更加简单,原生 Django View 通过重写 get 和 post 方法的具体视图来达到实现逻辑
在 Viewset 中则可通过:

view = MyViewSet.as_view({'get': 'list', 'post': 'create'})

参考

View 介绍

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值