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.