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.