django rest framework-视图集(ViewSets)和路由(Routers)

REST框架包括一个用于抽象处理的ViewSets,允许开发人员集中精力对API的状态和交互进行建模,并根据常见约定自动处理URL构造。Viewset 类和 View类相似,但提供的是read或update,而不是http动作get或put。目前,一个ViewSet类只绑定一个方法的集合,当它被实例化为视图的集合时,一般使用为你处理复杂的URL定义的Router类。

使用视图集viewsets

重构类视图

让我们来用视图集重写当前视图。 首先,我们要把我们的ArticleListleView视图重写成单个ArticleViewSet
views.py

from rest_framework import viewsets
class ArticleViewSet(mixins.ListModelMixin, mixins.CreateModelMixin, viewsets.GenericViewSet):
    queryset = Article.objects.all()  # 查询结果集
    serializer_class = ArticleSerializer # 序列化类
url配置

当我们定义URLConf时,处理方法只绑定到动作。为了看看发生了什么,我们必须从我们的视图集(ViewSets)创建一个视图集合。在urls.py文件中,我们将ViewSet类绑定到具体视图的集合。

article_list = ArticleViewSet.as_view({
    'get': 'list',
    'post': 'create'
})

urlpatterns = [
    # path('articles/', ArticleListleView.as_view(), name='article_list' ) 修改为下面配置
    path('articles/', article_list, name='article_list'),
]
测试效果

django rest framework-视图集(ViewSets)和路由(Routers)_第1张图片
image.png

注意:我们如何通过将每个视图的http方法绑定到所需的操作,从每个ViewSet类创建多个视图。

使用路由routers

我们现在使用的是使用ViewSet类而不是View类,我们不需要定义我们的url,我们使用routers,我们需要做的只是用一个路由注册合适的视图集合。使用Router类就可以自动将资源与视图(views)、链接(urls)联系起来。
修改urls.py

from rest_framework.routers import DefaultRouter

# article_list = ArticleViewSet.as_view({
#     'get': 'list',
#     'post': 'create'
# })

router = DefaultRouter()
router.register('articles', ArticleViewSet)

urlpatterns = [
    #path('articles/', article_list, name='article_list'),
    path('', include(router.urls)),
]

用路由注册视图和提供一个urlpattern是相似的,包括两个参数-->视图的URL前缀和视图本身。
我们使用的默认路由(DefaultRouter)类会自动为我们创建API根视图,所以我们就可以从我们的views模块删除api_root方法。

views和viewsets的比较

使用视图集(viewsets)真的很有用。它保证URL规范存在你的API中,让你写最少的代码,
允许你把注意力集中在你的API提供的交互和表现上而不需要特定的URL配置。这并不意味着这样做总是正确的。
在使用基于类的视图代替基于函数的视图时,我们总会发现views与viewsets有相似的地方。
使用视图集(viewsets)没有比你自己的视图更清晰。

你可能感兴趣的:(django rest framework-视图集(ViewSets)和路由(Routers))