如果您的目标是标准行为和标准 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"),
]