2015-09-15 2 views
14

Может быть relevant.Django REST Framework: разница между видами и видами?

В чем разница между видами и Просмотры? А как насчет маршрутизатор и urlpatterns?

+0

Вы читали [учебник о viewsets] (http://www.django-rest-framework.org/tutorial/6-viewsets-and-routers/) ? Он описывает перемещение из представлений + urlpatterns в viewets + routers. Есть ли что-то конкретное, что вы не понимаете? – Alasdair

+1

Привет @Alasdair, да, я прочитал учебник, и, хотя он очень хорошо объясняет, как работать с представлениями, кажется, он не тратит много слов на то, каковы различия между представлениями и представлениями. Единственный абзац, который кажется уместным, - это классы «ViewSet» - это почти то же самое, что и классы View, за исключением того, что они предоставляют такие операции, как чтение или обновление, а не обработчики методов, такие как get или put ». Но даже этот абзац не кажется явным (например, почему вы предпочитаете читать и обновлять, чтобы их можно было или положить?). –

+0

Преимущество 'read' и' update' над 'get' и' put' заключается в том, что вы отключили методы api из методов HTTP, используемых для их вызова. Затем вы можете использовать маршрутизаторы, чтобы подключить viewet к URL-адресам, что экономит код и может сделать ваш API более последовательным. – Alasdair

ответ

37

ViewSets и Routers - это простые инструменты для ускорения реализации вашего API, если вы нацелены на стандартное поведение и стандартные URL-адреса.

Используя ViewSet, вам не нужно создавать отдельные представления для получения списка объектов и деталей одного объекта. ViewSet будет обрабатывать для вас согласованным образом как список, так и детали.

Использование Router приведет к подключению вашего ViewSet к «стандартизованному» (он не является стандартным ни в каком глобальном виде, только в некоторой структуре, реализованной создателями структуры Django REST). Таким образом, вам не нужно создавать свои URL-адреса вручную, и вам гарантировано, что все ваши URL-адреса являются согласованными (по крайней мере, на уровне, за который отвечает Router).

Это не так много, но при реализации огромного api, где у вас будет много и много URL-адресов и просмотров, использование ViewSets и Routers будет иметь большое значение.

Для лучшего объяснения: это код, используя ViewSets и маршрутизаторы:

views.py:

from snippets.models import 
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"), 
] 
+0

Извините, но я продолжаю его не видеть. :(В чем разница между: 'router = routers.SimpleRouter(), router.register (r'accounts ', AccountViewSet)' и 'urlpatterns = [url (r'^accounts/', AccountView),]'? –

+1

Сначала вы зарегистрируете 2 URL-адреса, один для списка и один для подробностей, см. Обновленный ответ – GwynBleidD

+0

Гораздо понятнее, спасибо! :) –

Смежные вопросы