Los viewsets y los routers en Django Rest Framework permiten refactorizar endpoints de forma limpia, centralizar la lógica por recurso y generar URLs automáticamente. Con un solo ModelViewSet por entidad y un DefaultRouter, es posible reemplazar vistas separadas tipo list y detail de APIView por una solución más simple, legible y fácil de mantener.
¿Qué son los viewsets y por qué simplifican las vistas en Django Rest?
Un viewset es una clase reutilizable que agrupa el comportamiento de un recurso. En lugar de definir varias vistas para listar y detallar, un solo viewset concentra operaciones como crear, listar, modificar y actualizar el recurso. Con un router, se registran los viewsets y se generan los patrones de URLs de forma automática.
- Menos código y más claridad: una clase por recurso.
- Generación automática de URLs con nombres útiles para el código.
- Soporte y mantenimiento más simple y estructurado.
Antes de implementarlo, conviene conocer la clase que se reutiliza. En el caso de ModelViewSet, los parámetros clave son: un QuerySet y un serializer. Estos dos son los requeridos para que el viewset funcione con el modelo correspondiente.
¿Cómo refactorizar a un ModelViewSet y conectar un router?
En la app “Doctors”, se crea un archivo dedicado (por ejemplo, viewsets.py) para centralizar los viewsets y mantener las vistas tradicionales por separado en views.py.
1) Definir el viewset del recurso Doctor.
# doctors/viewsets.py
from rest_framework.viewsets import ModelViewSet
from doctors.models import Doctor
from doctors.serializers import DoctorSerializer
class DoctorViewSet(ModelViewSet):
queryset = Doctor.objects.all()
serializer_class = DoctorSerializer
- QuerySet: datos del modelo que gestionará el viewset.
- Serializer: clase que serializa/deserializa el recurso.
2) Registrar el viewset en un router y exponer las URLs.
# config/urls.py (o el módulo de URLs principal)
from rest_framework.routers import DefaultRouter
from doctors.viewsets import DoctorViewSet
router = DefaultRouter()
router.register('doctors', DoctorViewSet)
urlpatterns = router.urls
- DefaultRouter: router que autogenera rutas y nombres.
- register: vincula el prefijo 'doctors' con el DoctorViewSet.
- router.urls: lista final de patrones de URL del proyecto.
Este patrón sustituye la definición manual de rutas individuales de list y detail. A medida que migres recursos, solo debes llamar a router.register(...) por cada uno.
¿Cómo verificar las URLs generadas y probar el recurso?
Es útil inspeccionar lo que produce el router antes de ejecutar el servidor. En una consola de Python con manage.py shell, puedes imprimir router.urls para ver una lista de patrones y sus nombres (por ejemplo, entradas tipo “doctors” y nombres como “doctor list”), lo que luego facilita el acceso programático desde el código.
Pasos de verificación y prueba rápida:
- Abrir la terminal y ejecutar
manage.py shell para revisar router.urls.
- Iniciar el servidor con
manage.py runserver.
- Navegar a la API en
localhost:8000/doctors y comprobar que carga.
- Enviar un POST para crear un registro de Doctor: nombre, profesión, teléfono, correo, dirección y biografía.
- Recargar para ver la lista de doctores con el nuevo registro.
Beneficios prácticos al usar viewsets y routers:
- URLs consistentes con nombres útiles para el código.
- Menos duplicación entre list y detail.
- Refactor ordenado: migrar vistas a viewsets y registrarlas en el router permite un mantenimiento más claro a futuro.
Como ejercicio, migra todas las vistas existentes a viewsets, regístralas con el router y verifica que el proyecto siga funcionando como hasta ahora.
¿Con qué recurso te gustaría empezar a refactorizar usando viewsets y routers? Comparte dudas o avances en los comentarios.