Está en la página 1de 4

VIEWSETS Y ROUTERS

DRF incluye una abstracción para tratar con conjuntos de vistas, que le permite al
desarrollador concentrarse en modelar el estado y las interacciones de la API, y
dejar que la construcción de URL se maneje automáticamente, según convenciones
comunes.

ViewSet son casi lo mismo que las clases View, excepto que proporcionan
operaciones como retrieve o update, y no manejadores de métodos como get o put.
Una clase ViewSet solo está vinculada a un conjunto de controladores de métodos
en el último momento, cuando se instancia en un conjunto de vistas, generalmente
mediante el uso de una clase Router que maneja las complejidades de definir la
configuración de Url.
Por lo tanto, el objetivo de usar viewsets y router, es reducir la cantidad de código
y mejorar su legibilidad.

REFACTORIZAR VISTAS

En desarrollo decimos que vamos a refactorizar, cuando tenemos que rehacer


código fuente que teníamos hecho, desde cero, para mejorarlo y aprovechar
nuevas funcionalidades.

Entonces vamos a tomar el actual conjunto de vistas (views) y refactoricémoslas en


conjuntos de vistas (viewsets).
En primer lugar, refactoricemos nuestras vistas UserList y UserDetail en un único
UserViewSet.
Podemos eliminar las dos vistas y reemplazarlas con una sola clase:

class UserViewSet(viewsets.ReadOnlyModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer

Aquí hemos utilizado la clase ReadOnlyModelViewSet para proporcionar


automáticamente las operaciones predeterminadas de 'solo lectura'. Todavía
estamos configurando los queryset y serializer_class exactamente como lo
hicimos cuando estábamos usando vistas regulares, pero ya no necesitamos
proporcionar la misma información a dos clases separadas.

A continuación, reemplazaremos las clases de vista LibroLists, LIbroDetails.


Podemos eliminar las 2 vistas y reemplazarlas nuevamente con una sola clase.

class LibroViewSet(viewsets.ModelViewSet):
queryset = Libro.objects.all()
serializer_class = LibroSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]

def perform_create(self, serializer):


serializer.save(owner=self.request.user)

Esta vez hemos usado la clase ModelViewSet para obtener el conjunto completo de
operaciones de lectura y escritura predeterminadas.

Usando Routers

Debido a que estamos usando clases ViewSet en lugar de clases View, en realidad
no necesitamos diseñar la URL conf. Las convenciones para conectar recursos en
vistas y URL se pueden manejar automáticamente, utilizando una clase de Router .
Todo lo que necesitamos hacer es registrar los conjuntos de vistas apropiados con
un enrutador y dejar que haga el resto.

Vamos a crear un nuevo archivo dentro de libros libros/urls.py

from django.urls import path, include


from rest_framework.routers import DefaultRouter
from libros import views

# Cree un enrutador y registre nuestros conjuntos de vistas con él.


router = DefaultRouter()
router.register(r'libros', views.LibroViewSet)
router.register(r'users', views.UserViewSet)

# Las URL de la API ahora las determina automáticamente el enrutador.


urlpatterns = [
path('', include(router.urls)),
]

También modificamos el archivo de urls general diciendo que incluya el archivo urls
de libros. De esta forma mantenemos separadas las urls por aplicación.

from django.urls import path, include

urlpatterns = [
path('admin/', admin.site.urls),
path('', include('libros.urls')),
]
Registrar los conjuntos de vistas con el enrutador es similar a proporcionar un
patrón de URL. Incluimos dos argumentos: el prefijo de URL para las vistas y el
propio conjunto de vistas.

La clase DefaultRouter que estamos usando también crea automáticamente la vista


raíz de API para nosotros, por lo que ahora podemos eliminar el método api_root
de nuestro módulo de vistas.

Ahora podemos probar todo nuevamente navegando con el navegador

El api root resuelto por la clase router

También podría gustarte