Resumen

Optimiza tu API en Django REST Framework con un endpoint que lista y crea pacientes en la misma URL, valida datos con serializadores y responde con códigos HTTP claros como 201 Created y 404 Not Found. Aprende a usar la variable request, el atributo method y a estructurar URLs por aplicación con include y parámetros .

¿Cómo crear y listar pacientes en un endpoint REST con GET y POST?

Un mismo recurso puede listar con GET y crear con POST usando la misma ruta. La clave está en leer request.method y aplicar un condicional por método para ejecutar la lógica correcta.

¿Qué hace la misma URL según el método?

  • En GET: se consulta la base de datos y se serializa con many=True.
  • En POST: se recibe request.data y se intenta crear un paciente.
  • La variable request expone el atributo method para decidir la acción.

¿Cómo validar y guardar con el serializador?

  • Se instancia el serializador con el parámetro data=request.data.
  • Se valida con isValid (en DRF se usa con excepciones para manejar errores automáticamente).
  • Si es válido, se guarda con serializer.save() como si fuera un ModelSerializer.
@api_view(['GET', 'POST'])
def list_patients(request):
    if request.method == 'GET':
        patients = Patient.objects.all()
        serializer = PatientSerializer(patients, many=True)
        return Response(serializer.data)
    if request.method == 'POST':
        serializer = PatientSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)  # raisedException en la explicación.
        serializer.save()
        return Response(status=status.HTTP_201_CREATED)

¿Qué responder al crear con HTTP 201 created?

  • Se puede retornar sin body y comunicar éxito solo con status=HTTP_201_CREATED.
  • Los campos de solo lectura (como id) no se toman del body: el backend asigna el valor.

¿Cómo manejar errores y validaciones con serializadores y códigos HTTP?

Validar entradas del usuario es crítico. Un dato inválido (por ejemplo, una fecha con formato incorrecto) no debe causar un 500, sino una respuesta JSON con errores de campo.

¿Qué pasa con datos inválidos y raisedException?

  • Al usar raisedException en la validación, DRF captura los errores y los formatea en JSON.
  • El cliente recibe el detalle del campo y el formato esperado, evitando caídas del servidor.

¿Por qué eliminar el if tras las excepciones?

  • Si se lanza una excepción de validación, el flujo se detiene.
  • Por eso, se puede omitir el if “si es válido” y dejar la secuencia: validar → guardar → responder.

¿Cómo implementar detalle y rutas en Django con include y parámetros?

Para el detalle, el mismo recurso admite ver con GET y modificar con PUT (el reto propuesto). Es necesario capturar el pk desde la URL y manejar el caso de un paciente inexistente.

¿Cómo obtener un paciente o responder 404 not found?

  • Intentar con get y capturar la excepción Patient.DoesNotExist.
  • Si no existe, retornar 404 Not Found.
@api_view(['GET', 'PUT'])
def detail_patient(request, pk):
    try:
        patient = Patient.objects.get(id=pk)
    except Patient.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)

    if request.method == 'GET':
        serializer = PatientSerializer(patient)
        return Response(serializer.data)

    if request.method == 'PUT':
        # Reto: implementar la modificación del paciente.
        pass

¿Cómo estructurar las URLs por aplicación con include y parámetros?

  • Crear un archivo urls.py en la app de pacientes.
  • En las URLs globales, usar include para incorporar las rutas de la app.
  • Capturar el parámetro con .
# project/urls.py
from django.urls import path, include

urlpatterns = [
    path('api/', include('patients.urls')),
]

# patients/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('patients/', views.list_patients),
    path('patients/<int:pk>/', views.detail_patient),
]

¿Qué tener en cuenta con el slash final y los 404 engañosos?

  • La consistencia del slash importa: una barra final mal definida puede confundirse con parte del pk y provocar 404.
  • Ajusta los patrones de ruta para que el pk no incluya el slash.

¿Te animas a completar el PUT para modificar un paciente? Comparte tu enfoque y decisiones en los comentarios.