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
classDoctorSerializer(serializers.ModelSerializer):defvalidate_email(self, value):# valida que el dominio corporativo esté presenteif"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
classDoctorSerializer(serializers.ModelSerializer):defvalidate(self, attrs): contact_number = attrs.get("contact_number") is_on_vacation = attrs.get("is_on_vacation")if is_on_vacation and(not contact_number orlen(contact_number)<10):# error general: no asociado a un solo camporaise serializers.ValidationError("por favor, ingresa un número válido antes de irte a vacaciones")returnsuper().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 booleanostrue/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).