Resumen

Organiza y escala tus endpoints en Django Rest Framework con un refactor claro: pasa de vistas basadas en funciones a vistas basadas en clases (APIView) y luego simplifica con vistas genéricas como ListApiView y CreateApiView. Verás cómo el código se vuelve más limpio, reutilizable y fácil de mantener sin perder control.

¿Por qué migrar de funciones a vistas basadas en clases en Django Rest Framework?

Las vistas basadas en clases permiten agrupar lógica por método HTTP y aprovechar funcionalidades nativas de DRF. Además, simplifican la configuración de métodos permitidos, permisos y throttle, y añaden soporte automático a HEAD y OPTIONS.

  • Estructura clara: métodos get, post, put, delete separados por función.
  • Escalabilidad real: reutilización con herencia y clases padre.
  • Validación automática: allowed methods limita respuestas a los métodos definidos.
  • Más herramientas listas: permisos y throttle disponibles cuando se necesiten.
  • Mejor experiencia de cliente: HEAD obtiene solo headers rápidamente. OPTIONS informa campos y métodos disponibles.

¿Cómo refactorizar ApiView a clases en DRF?

Primero, importa la clase y crea tu vista basada en clases. Luego define los métodos HTTP y conecta la URL con as_view.

¿Cómo declarar la clase y métodos get/post?

from rest_framework.views import ApiView class ListPatientsView(ApiView): allowed_methods = ['GET', 'POST'] def get(self, request): # Copia la lógica de listado que usabas en la vista basada en función. pass def post(self, request): # Copia la lógica de creación del recurso patient. pass
  • Idea clave: allowed methods valida qué métodos responderán.
  • Beneficio: el recurso lista queda expresivo: GET lista, POST crea.

¿Cómo conectar la URL con as_view?

from django.urls import path from .views import ListPatientsView urlpatterns = [ path('patients/', ListPatientsView.as_view()), ]
  • Usa as_view para obtener la vista ejecutable.
  • La interfaz navegable de DRF mostrará además HEAD y OPTIONS automáticamente.

¿Cómo convertir el detalle con get/put/delete?

from rest_framework.views import ApiView class DetailPatientView(ApiView): allowed_methods = ['GET', 'PUT', 'DELETE'] def get(self, request, pk): # Recupera y retorna el paciente por pk. pass def put(self, request, pk): # Actualiza el paciente por pk. pass def delete(self, request, pk): # Elimina el paciente por pk. pass
  • Al refactorizar notarás duplicación de consultas para obtener el objeto.
  • Señal de mejora: extraer una función auxiliar o pasar a vistas genéricas.

¿Qué simplifican las vistas genéricas ListApiView y CreateApiView?

Las vistas genéricas ya traen implementados los métodos estándar de REST. Solo defines serializerClass y QuerySet, y DRF se encarga del resto. Así reduces tu vista de lista y creación a pocas líneas.

from rest_framework.generics import ListApiView, CreateApiView class ListPatientsView(ListApiView, CreateApiView): serializerClass = PatientSerializer QuerySet = Patient.objects.all()
  • serializerClass: indica cómo serializar y validar los datos.
  • QuerySet: especifica de dónde obtener los elementos a listar o crear.
  • Efecto inmediato: puedes borrar el get y el post manuales.

Además, en la interfaz navegable puedes alternar entre HTML form y raw data para enviar JSON; DRF incluso muestra un datetime picker para fechas. Si más adelante necesitas personalizar comportamiento, ya sabes qué método sobrescribir porque entendiste el flujo manual primero.

  • Conceptos fortalecidos: ApiView, allowed methods, as_view, ListApiView, CreateApiView, DestroyApiView, serializerClass, QuerySet, permisos, throttle, HEAD, OPTIONS, frontend, raw data.
  • Habilidades prácticas: refactor paso a paso, herencia múltiple de vistas genéricas, eliminación de duplicación, uso de la interfaz navegable para probar endpoints.

¿Te animas a dar el siguiente paso? Implementa el detalle con vistas genéricas y comparte tu código en comentarios para recibir feedback.