Django REST Framework: разница между представлениями и видами?

Может быть релевантным.

В чем разница между представлениями и видами > ? А как насчет маршрутизатора и urlpatterns?

Ответы

Ответ 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"),
]