django rest framework之六:view 总结

最终我们一般都会使用 GenericViewSet 来完成我们的 视图,

各种视图的关系如下 (下面的继承上面的):

一、 View : django 自带的 视图方法 ,也可以返回 json 数据,但是用来做 restful aoi 功能

不够强大,编写完视图后需要在路由里面调用 as_view() 方法进行设置 。【可以直接继承】

二、 APIView :rest_framework 的view, 继承自 View ,可以做 restful aoi 功能,

但是需要自己重写 get 、post 等方法,编写完视图后也需要在路由里面调用

as_view() 方法进行设置 , 【可以直接继承】

三、GenericAPIView : rest_framework 的view ,继承自 APIView,没有 post、get 等方法,需要跟

mixins.ListModelMixin 同时继承才能使用 , 并且在最后需要定义 get 方法 来调用 ListModelMixin

的 list 方法实现 get 、post 等方法。

def get(self, request, *args, **kwargs):

return self.list(request, *args, **kwargs)

可以完成分页等功能,只需对 queryset(要展示的结果) 、 serializer_class(序列化器) 、 pagination_class(分页) 等

属性进行配置即可。 【需要跟 mixins.ListModelMixin 同时继承才能使用】

四、 ListAPIView : rest_framework 的view ,继承自 mixins.ListModelMixin 和 GenericAPIView ,

并且包含了 get 方法来调用 ListModelMixin 的 list 方法 , 算是对 GenericAPIView 的一个封装,

【可以直接继承】

class ListAPIView(mixins.ListModelMixin, GenericAPIView):



    def get(self, request, *args, **kwargs):

        return self.list(request, *args, **kwargs)

五、 GenericViewSet : rest_framework 的view ,继承自 ViewSetMixin 和 generics.GenericAPIView,

其中 ViewSetMixin 重写了 as_view 方法,

GenericViewSet 不能直接继承,要和 mixins.ListModelMixin 一起继承,ListModelMixin 主要是对

model 中得到的数据进行 分页,然后进行序列化,通过 Response 方法返回。

class ListModelMixin(object):



    def list(self, request, *args, **kwargs):

        queryset = self.filter_queryset(self.get_queryset())


        page = self.paginate_queryset(queryset)

        if page is not None:

            serializer = self.get_serializer(page, many=True)

            return self.get_paginated_response(serializer.data)


        serializer = self.get_serializer(queryset, many=True)

        return Response(serializer.data)

如果我们选择使用 GenericViewSet ,那么我们可以通过以下方式来配置路由 :

1.路由绑定,先调用 视图的 as_view 方法对 get 、 post 方法进行 绑定

snippet_list = SnippetListViewSet.as_view({

    'get':'list',

    'post':'create',

})

再把这个结果写到 django 的 url 里面

url(r'^SnippetList/$',snippet_list,name='SnippetList'),

2.路由注册

先导入 rest_framework.routers 获取一个实例化对象

from rest_framework.routers import DefaultRouter

router = DefaultRouter()

再把这个实例化对象设置到 django 的url 中

url(r'^', include(router.urls)),

最后根据需要把图注册到路由里面

router.register(r'SnippetList', SnippetListViewSet)

猜你喜欢

转载自blog.csdn.net/qq_26128879/article/details/82431625