2015-09-15 31 views
14

Può essere relevant.Django REST Framework: differenza tra visualizzazioni e viewet?

Qual è la differenza tra vista e viewsets? E per quanto riguarda router e urlpatterns?

+0

Hai letto il [tutorial su viewsets] (http://www.django-rest-framework.org/tutorial/6-viewsets-and-routers/) ? Descrive lo spostamento da view + urlpatterns a viewets + router. C'è qualcosa di specifico che non capisci? – Alasdair

+1

Hi @Alasdair, sì, ho letto il tutorial e mentre spiega molto bene come lavorare con viewsets non sembra di spendere molte parole su ciò che sono le differenze tra viewsets e punti di vista. L'unico paragrafo che sembra rilevante è "Le classi ViewSet sono quasi la stessa cosa delle classi View, tranne che forniscono operazioni come read o update e non gestori di metodi come get o put". Ma anche questo paragrafo non sembra particolarmente chiaro (ad esempio, perché preferiresti leggere e aggiornare per ottenere o mettere?). –

+0

Il vantaggio di 'read' e' update' su 'get' e' put' è che hai disaccoppiato i metodi api dai metodi HTTP usati per chiamarli. Puoi quindi utilizzare i router per agganciare il viewet agli URL, salvando il codice e rendendo la tua API più coerente. – Alasdair

risposta

37

ViewSets e Routers sono semplici strumenti per velocizzare l'implementazione dell'API, se si punta al comportamento standard e agli URL standard.

Utilizzando ViewSet non si dispone di creare viste separate per ottenere la lista di oggetti e dettagli di un oggetto. ViewSet gestirà in modo coerente sia l'elenco che i dettagli.

Utilizzando Router colleghi il vostro ViewSet in "normalizzata" (non è di serie in alcun modo globale, solo qualche struttura che è stata implementata dai creatori di Django REST quadro) la struttura degli URL. In questo modo non c'è bisogno di creare i urlpatterns a mano e il gioco è garantito che tutti gli URL sono coerenti (almeno su layer che Router è responsabile).

Sembra non molto, ma quando l'attuazione di alcune enorme api, dove avrete molte e molti urlpatterns e punti di vista, utilizzando ViewSets e Routers farà grande differenza.

Per spiegare meglio: questo è il codice utilizzando ViewSets e router:

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)), 
] 

E risultato equivalente utilizzando le normali viste e non router:

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

Scusa, ma continuo a non vederlo. :(Qual è la differenza tra: 'router = routers.SimpleRouter(); router.register (r'accounts', AccountViewSet)' e 'urlpatterns = [url (r '^ conti /', AccountView),]' –

+1

? Il primo registrerà 2 URL, uno per la lista e uno per i dettagli, vedi la risposta aggiornata – GwynBleidD

+0

Molto più chiara, grazie! :) –

Problemi correlati