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.