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?
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?
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"),
]
Scusa, ma continuo a non vederlo. :(Qual è la differenza tra: 'router = routers.SimpleRouter(); router.register (r'accounts', AccountViewSet)' e 'urlpatterns = [url (r '^ conti /', AccountView),]' –
? Il primo registrerà 2 URL, uno per la lista e uno per i dettagli, vedi la risposta aggiornata – GwynBleidD
Molto più chiara, grazie! :) –
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
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?). –
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