Resumen

Optimiza tu API en Django REST Framework con una estrategia clara: usa ViewSets y routers para reducir código, estandarizar rutas y mejorar el mantenimiento. Con un solo ModelViewSet podrás cubrir operaciones de lista, detalle, creación, actualización y eliminación, mientras un DefaultRouter genera las URLs automáticamente. Así, la app Doctors queda más limpia, legible y fácil de escalar.

¿Qué es un viewset y por qué simplifica las vistas?

Un ViewSet es una clase reutilizable que agrupa la lógica de un recurso y evita escribir múltiples vistas separadas. En lugar de tener vistas para lista y detalle con APIView, se define un único ModelViewSet que centraliza la configuración.

  • Menos clases, más claridad.
  • Una sola fuente para CRUD.
  • Mejor soporte y mantenimiento.

¿Qué recibe un ModelViewSet: queryset y serializer?

La clase base que se reutiliza define dos atributos clave: un QuerySet y un serializer. Con esto, DRF sabe qué datos consultar y cómo serializarlos.

  • queryset: origen de datos del modelo.
  • serializer_class: conversión a/desde JSON.

Ejemplo mínimo para Doctors:

# doctors/viewsets.py
from rest_framework import viewsets
from doctors.models import Doctor
from doctors.serializers import DoctorSerializer

class DoctorViewSet(viewsets.ModelViewSet):
    queryset = Doctor.objects.all()
    serializer_class = DoctorSerializer

¿Cómo organizar el módulo viewsets en la app Doctors?

Separa responsabilidades: mantén en views.py solo las vistas que sigan activas y crea un archivo dedicado (por ejemplo, ViewSets.py) para centralizar todos los ViewSets de la app.

  • Estructura por módulos.
  • Código más fácil de localizar.
  • Transición ordenada desde APIView.

¿Cómo registrar el viewset en un router y generar URLs?

Un router crea los patrones de URLs y los asocia al ViewSet. Con DefaultRouter no necesitas escribir rutas manuales: basta con registrar el recurso con un prefijo.

  • Importa el DefaultRouter desde rest_framework.routers.
  • Registra el ViewSet con el prefijo "doctors".
  • Expón las rutas usando router.urls.

Ejemplo de urls.py:

# config/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from doctors.viewsets import DoctorViewSet

router = DefaultRouter()
router.register('doctors', DoctorViewSet)

urlpatterns = router.urls

¿Cómo verificar las URLs generadas?

Puedes inspeccionar las rutas en una consola interactiva. Al crear un DefaultRouter y registrar el ViewSet, la propiedad router.urls muestra una lista de patrones y nombres legibles (por ejemplo, el listado suele aparecer con un nombre tipo doctor list), útiles para acceso programático.

  • Ejecuta manage.py shell.
  • Importa el ViewSet y crea el router.
  • Llama a router.urls para ver los patrones.

¿Cómo migrar rutas existentes al router?

Sustituye las entradas manuales del arreglo urlpatterns por router.urls. Registra cada recurso con router.register y concentra todo en una sola variable.

  • Quita rutas duplicadas de lista/detalle.
  • Registra cada ViewSet con su prefijo.
  • Deja urlpatterns = router.urls para mantenerlo simple.

¿Qué habilidades y buenas prácticas refuerza este refactor?

Este enfoque impulsa un desarrollo más claro y sostenible. Centralizas la lógica de cada entidad, automatizas rutas y mejoras los nombres de URL para usarlos en el código.

  • Refactor de APIView a ModelViewSet para CRUD completo.
  • Uso de DefaultRouter para generar URL patterns sin esfuerzo.
  • Importaciones ordenadas: modelos, serializers y viewsets.
  • Prefijos consistentes por recurso para rutas más limpias.
  • Nombres de URL útiles para acceso programático.
  • Pruebas manuales rápidas en la API para validar creación y listado.

¿Quieres compartir cómo migraste tus rutas a ViewSets y routers o qué entidades transformarás a continuación? Deja tu comentario y cuéntalo paso a paso.