Resumen

La confiabilidad de una API inicia con datos limpios. Aquí verás, paso a paso, cómo implementar validaciones personalizadas en Django Rest Framework desde los serializers para controlar correos corporativos y reglas que combinan varios campos, generando mensajes de error claros en JSON y respuestas consistentes en el backend.

¿Cómo validar correos corporativos en Django Rest Framework?

La idea central es restringir el correo a un dominio específico, por ejemplo, @example.com, dentro del serializer del doctor. Aunque el campo email del modelo ya es de tipo EmailField y valida el formato, se necesita una validación custom de dominio. La estrategia es usar un método con nombre especial: validate_<campo>.

  • Usa el método validate_email para validar solo el campo email.
  • Retorna el valor si es válido. Lanza excepción si es inválido.
  • La excepción es serializers.ValidationError y DRF la muestra como JSON con estado 400.

Ejemplo basado en lo explicado:

from rest_framework import serializers

class DoctorSerializer(serializers.ModelSerializer):
    def validate_email(self, value):
        # valida que el dominio corporativo esté presente
        if "example.com" in value:
            return value
        raise serializers.ValidationError("el correo debe incluir @example.com")
  • Este método se activa automáticamente al correr el sistema de validación.
  • Si el valor es inválido, la respuesta será un 400 con el detalle del error.
  • También podrías pasar código o detalles extra en la excepción, pero aquí basta el texto.

¿Qué pasa si el correo no es válido?

  • Se lanza serializers.ValidationError con un mensaje claro.
  • El serializer serializa el error a JSON y lo muestra ligado al campo email.
  • El mensaje visto en pantalla es directo: "el correo debe incluir @example.com".

¿Cuándo usar validate para varias reglas de negocio?

Cuando la regla depende de más de un campo, se emplea el método validate(self, attrs). En el ejemplo, se cruza contact_number con is_on_vacation: si el doctor se marca en vacaciones sin un teléfono válido (mínimo 10 caracteres), se bloquea la actualización.

  • attrs es un diccionario con todos los valores validados por campo.
  • Accede con attrs.get("nombre_del_campo").
  • Lanza serializers.ValidationError para errores que no pertenecen a un único campo.

Ejemplo basado en lo explicado:

from rest_framework import serializers

class DoctorSerializer(serializers.ModelSerializer):
    def validate(self, attrs):
        contact_number = attrs.get("contact_number")
        is_on_vacation = attrs.get("is_on_vacation")

        if is_on_vacation and (not contact_number or len(contact_number) < 10):
            # error general: no asociado a un solo campo
            raise serializers.ValidationError(
                "por favor, ingresa un número válido antes de irte a vacaciones"
            )

        return super().validate(attrs)

¿Cómo se muestran los errores en JSON?

  • Al subir reglas cruzadas a validate, DRF agrupa el error como non-field error.
  • El arreglo de mensajes aparece bajo la clave "non_field_errors".
  • En pruebas con PATCH, si todo es correcto, la respuesta es 200 ok y los cambios se reflejan.

¿Qué habilidades y keywords refuerzas con estas validaciones?

Aplicar estas técnicas mejora la calidad de datos y la experiencia de uso en endpoints sensibles.

  • Manejo de errores de validación con serializers.ValidationError y estado 400.
  • Validación custom con validate_<campo> para email corporativo.
  • Reglas de negocio cruzadas con validate(self, attrs) y errores tipo non-field errors.
  • Mensajes de error claros y consistentes en JSON.
  • Uso de booleanos true/false y verificación de longitud mínima para teléfonos.
  • Buenas prácticas en serializer: retornar el valor si es válido y delegar a super().validate(attrs).
  • Palabras clave: Django Rest Framework, serializer, serializers, JSON, validate_email, validate, ValidationError, dominio corporativo, contact_number, is_on_vacation, PATCH, 200 ok, endpoints, backend, API.

¿Tienes ideas para validar datos de pacientes? Comparte tus reglas personalizadas y ejemplos en los comentarios.