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.