视图和视图集之间的区别?
Posted
技术标签:
【中文标题】视图和视图集之间的区别?【英文标题】:Difference between views and viewsets? 【发布时间】:2015-12-11 21:19:12 【问题描述】:可能相关:What does django rest framework mean trade offs between view vs viewsets?
views
和 viewsets
有什么区别?那么router
和urlpatterns
呢?
【问题讨论】:
你读过tutorial about viewsets吗?它描述了从视图 + urlpatterns 到视图集 + 路由器的移动。有什么不明白的地方吗? 嗨@Alasdair,是的,我阅读了本教程,虽然它很好地解释了如何使用视图集,但它似乎并没有花太多词来说明视图集和视图之间的区别。唯一似乎相关的段落是“ViewSet 类与 View 类几乎相同,除了它们提供诸如读取或更新之类的操作,而不是诸如 get 或 put 之类的方法处理程序”。但即使这一段似乎也不是特别清楚(例如,为什么你更喜欢 read 和 update 而不是 get 或 put?)。read
和 update
优于 get
和 put
的好处是,您将 api 方法与用于调用它们的 HTTP 方法分离。然后,您可以使用路由器将视图集挂钩到 url,这样可以节省代码并使您的 API 更加一致。
【参考方案1】:
如果您的目标是标准行为和标准 URL,ViewSets
和 Routers
是加速 API 实施的简单工具。
使用ViewSet
,您不必创建单独的视图来获取对象列表和一个对象的详细信息。 ViewSet
将以一致的方式为您处理列表和详细信息。
使用Router
会将您的ViewSet
连接到URL 的“标准化”(它不是任何全球标准,只是由Django REST 框架的创建者实现的一些结构)结构。这样您就不必手动创建您的urlpatterns
,并且可以保证您的所有 URL 都是一致的(至少在Router
负责的层上)。
看起来不多,但在实现一些巨大的 API 时,您将拥有许多 urlpatterns
和视图,使用 ViewSets
和 Routers
会产生很大的不同。
为了更好的解释:这是使用ViewSets
和Routers
的代码:
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基于类的视图