Ответ 1
ViewSets
и Routers
- это простые инструменты для ускорения реализации вашего API, если вы нацелены на стандартное поведение и стандартные URL-адреса.
Используя ViewSet
вам не нужно создавать отдельные представления для получения списка объектов и деталей одного объекта. ViewSet будет обрабатывать для вас согласованным образом как список, так и детали.
Использование Router
подключит ваш ViewSet
к "стандартизованному" (он не является стандартным каким-либо глобальным способом, а не какой-либо структурой, которая была ViewSet
структуры Django REST) для URL-адресов. Таким образом, вам не нужно создавать свои URL-адреса вручную, и вам гарантировано, что все ваши URL-адреса являются согласованными (по крайней мере, на уровне, за который отвечает Router
).
Это выглядит не так много, но при реализации огромного api, где у вас будет много и много URL-адресов и просмотров, использование 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.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"),
]