zoukankan      html  css  js  c++  java
  • Django-rest-framework(三)view and viewsets使用

    DRF 中有多种view和viewsets,我整理了一下,如下图所示,接下来,我们分别了解下view,viewsets。

    APIView

    所有的view,viewsets都是继承APIView,而APIView是继承的django的django.views.generic.View, 然后增加了一些通用的操作,和重载了as_view,dispatch,options,http_method_not_allowed 方法来适应DRF相关的配置和后续的使用。
    在直接使用APIView的时候,就和使用django View一样,分发规则也是一样,GET请求分发到了get方法,POST请求分发到post方法, 所以路由的注册方式也一样。所以在这里不做演示了。

    GenericAPIView

    通用view的基础视图,其他的基础view都是继承了这个view,我们可以来看看源码里面实现了那些个方法

    # 为了简化,我删掉了注释和具体的实现,
    class GenericAPIView(views.APIView):
        queryset = None # 这些会在mixins中用到
        serializer_class = None
        lookup_field = 'pk'
        lookup_url_kwarg = None
        pagination_class = api_settings.DEFAULT_PAGINATION_CLASS
        def get_queryset(self):
        def get_object(self):
        def get_serializer(self, *args, **kwargs):
        def get_serializer_class(self):
        def get_serializer_context(self):
        def filter_queryset(self, queryset):
        @property
        def paginator(self):
        def paginate_queryset(self, queryset):
        def get_paginated_response(self, data):
    

    可以看出,在这里,我们定义了queryset,serializer相关的操作。我们也可以继承GenericAPIView 来使用定义好的一些方法。

    drf-mixins

    在这里,我们插入mixins这一部分,因为后面要介绍的这些view,viewset,都是使用了这种方式实现,在DRF中,有5种mixin,我们还是看看源码里面,

    # 还是删除了多余的代码,只看有哪些方法,
    # 一共有5种mixin,分别实现列表显示,单个资源显示,增加,修改,删除操作。
    # 后面讲解的views,veiwsets就是通过继承不同的mixin来实现对应功能
    # 在这些方法的实现中,需要用到queryset,serializers,所以使用了mixin的时候,需要在view里指定这两个参数
    class CreateModelMixin(object):
        def create(self, request, *args, **kwargs):
    
    class ListModelMixin(object):
        def list(self, request, *args, **kwargs):
        
    class RetrieveModelMixin(object):
        def retrieve(self, request, *args, **kwargs):
    
    class UpdateModelMixin(object):
        def update(self, request, *args, **kwargs):
    
    class DestroyModelMixin(object):
        def destroy(self, request, *args, **kwargs):
    

    *APIView

    本部分讲解以APIView结尾这这些个views,包括CreateAPIView,ListAPIView,RetrieveAPIView, DestroyAPIView,UpdateAPIView, ListCreateAPIView, RetrieveUpdateAPIView, RetrieveDestroyAPIView, RetrieveUpdateDestroyAPIView。这些都是通过继承GenericAPIView 和不同的mixin实现,所以我们只选择其中的一个来作为讲解,下面看看ListAPIView 中的内容

    class ListAPIView(mixins.ListModelMixin,
                      GenericAPIView):
        def get(self, request, *args, **kwargs):
            return self.list(request, *args, **kwargs)
    

    因为继承的GenericAPIView,并没有修改分发方式,所以也是GET请求分发到get方法,又因为继承了ListModelMixin,所以会有list(self)方法,于是自然而然的,就在get方法中,调用self.list()去使用ListModelMixin中定义的方法。其他的views类似,都是把对应的请求转发到合适的mixin里面。至此,drf中的views就完了。

    viewsets

    下面,我们来研究研究viewsets了,它不同与django原生的view,因为有修改分发方式,所以处理上会有些许的不同,还是老规矩,上源码。

    使用

    class ViewSetMixin(object):
        #代码就不贴了,需要配合着看route才能理解,准备后面单独开一篇来配合着route的处理来写,
        #在这里,我们只需要知道在这个类中,重写了分发规则as_view(),
        #规则大概来说就是,将对应的请求分发到list,create等在mixins定义了的方法中, 比如说,get请求分发到list,或者retrieve。
    
    class GenericViewSet(ViewSetMixin, generics.GenericAPIView):
        pass
        
    class ReadOnlyModelViewSet(mixins.RetrieveModelMixin,
                               mixins.ListModelMixin,
                               GenericViewSet):
        # model的只读接口,实现了列表页和详情页的
        pass
                               
    class ModelViewSet(mixins.CreateModelMixin,
                       mixins.RetrieveModelMixin,
                       mixins.UpdateModelMixin,
                       mixins.DestroyModelMixin,
                       mixins.ListModelMixin,
                       GenericViewSet):
        # model 的增删改查的接口
        pass
    

    通过源码,我们可以发现,我们可以自己选择继承GenericViewSet 和对应的mixins来实现我们所需要的接口。

    路由注册

    因为改了分发方式,所以,不能简单的像之前的 path('view', View.as_view())一样了,我们需要像下面这样引入route。

    from myapp.views import ViewSet
    from rest_framework.routers import DefaultRouter
    
    router = DefaultRouter()
    router.register(r'users', ViewSet) # url 为 "/api/user/"
    
    urlpatterns = [
        path('api/', include(router.urls), name='api'),
        ]
    
  • 相关阅读:
    初学者之 Git 和 Github
    80端口与8080端口是两种不同的端口吗?他们到底有什么区别和联系?
    redis 基础(一) 初步了解redis
    spring 基础(四)浏览器跨域访问+拦截器(Interceptor)
    mysql商业版和社区版
    spring 基础(五) spring mvc RESTful
    解决idea控制台打印乱码问题
    springBoot 基础-拓展(二) 记录一些常用的配置文件
    SpringBoot 基础(零) SpringBoot和Spring
    springBoot 基础-拓展(一) spring-boot-starter
  • 原文地址:https://www.cnblogs.com/yuzhenjie/p/10346455.html
Copyright © 2011-2022 走看看