视图和视图集之间的区别?

Posted

技术标签:

【中文标题】视图和视图集之间的区别?【英文标题】:Difference between views and viewsets? 【发布时间】:2015-12-11 21:19:12 【问题描述】:

可能相关:What does django rest framework mean trade offs between view vs viewsets?

viewsviewsets 有什么区别?那么routerurlpatterns 呢?

【问题讨论】:

你读过tutorial about viewsets吗?它描述了从视图 + urlpatterns 到视图集 + 路由器的移动。有什么不明白的地方吗? 嗨@Alasdair,是的,我阅读了本教程,虽然它很好地解释了如何使用视图集,但它似乎并没有花太多词来说明视图集和视图之间的区别。唯一似乎相关的段落是“ViewSet 类与 View 类几乎相同,除了它们提供诸如读取或更新之类的操作,而不是诸如 get 或 put 之类的方法处理程序”。但即使这一段似乎也不是特别清楚(例如,为什么你更喜欢 read 和 update 而不是 get 或 put?)。 readupdate 优于 getput 的好处是,您将 api 方法与用于调用它们的 HTTP 方法分离。然后,您可以使用路由器将视图集挂钩到 url,这样可以节省代码并使您的 API 更加一致。 【参考方案1】:

如果您的目标是标准行为和标准 URL,ViewSetsRouters 是加速 API 实施的简单工具。

使用ViewSet,您不必创建单独的视图来获取对象列表和一个对象的详细信息。 ViewSet 将以一致的方式为您处理列表和详细信息。

使用Router 会将您的ViewSet 连接到URL 的“标准化”(它不是任何全球标准,只是由Django REST 框架的创建者实现的一些结构)结构。这样您就不必手动创建您的urlpatterns,并且可以保证您的所有 URL 都是一致的(至少在Router 负责的层上)。

看起来不多,但在实现一些巨大的 API 时,您将拥有许多 urlpatterns 和视图,使用 ViewSetsRouters 会产生很大的不同。

为了更好的解释:这是使用ViewSetsRouters的代码:

views.py:

from snippets.models import Article
from rest_framework import viewsets
from yourapp.serializers import ArticleSerializer

class ArticleViewSet(viewsets.ModelViewSet):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer

urls.py:

from django.conf.urls import url, include
from yourapp import views
from rest_framework.routers import DefaultRouter

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

urlpatterns = [
    url(r'^', include(router.urls)),
]

使用普通Views 和没有routers 的等效结果:

views.py:

from snippets.models import Article
from snippets.serializers import ArticleSerializer
from rest_framework import generics


class ArticleList(generics.ListCreateAPIView):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer


class ArticleDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer

urls.py

from django.conf.urls import url, include
from yourapp import views

urlpatterns = [
    url(r'articles/^', views.ArticleList.as_view(), name="article-list"),
    url(r'articles/(?P<pk>[0-9]+)/^', views.ArticleDetail.as_view(), name="article-detail"),
]

【讨论】:

抱歉,我还是没看到。 :( router = routers.SimpleRouter(); router.register(r'accounts', AccountViewSet)urlpatterns = [url(r'^accounts/', AccountView),] 之间有什么区别? 第一个将注册2个URL,一个用于列表,一个用于详细,请参阅更新答案 很好的例子,这对我帮助很大,尽管我使用了基于类的视图,但我很难看到其中的区别。这很明显,我希望文档是这样的。快速提问:在您的第一个视图集示例中,您是否忘记导入 Article

以上是关于视图和视图集之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

Django后端开发学习笔记Django REST Framework基于类的视图

Django后端开发学习笔记Django REST Framework基于类的视图

视图和赋值之间的区别

视图与索引视图或物化视图之间的区别

Aurelia 中组件和视图之间的区别(及其生命周期)

使用视图和临时表之间有啥区别(系统资源方面)?