Aprende a controlar errores de validación en Django Rest Framework con serializers y reglas personalizadas. Con un caso real de correos corporativos @example.com y una verificación entre campos, verás cómo convertir excepciones en respuestas JSON claras y mantener datos confiables en el backend de tu API.
¿Cómo validar un email corporativo en Django Rest Framework?
Para restringir el registro a correos corporativos, se implementa una validación por campo en el serializer. El campo email ya valida formato, pero no el dominio. La solución es usar el método específico para el campo y lanzar una serializers.ValidationError con un mensaje claro cuando no cumpla la regla de negocio.
from rest_framework import serializers
class DoctorSerializer(serializers.ModelSerializer):
class Meta:
model = Doctor
fields = ["email", "is_on_vacation", "contact_number"]
def validate_email(self, value):
# Acepta solo correos que incluyan el dominio corporativo.
if "example.com" in value:
return value
raise serializers.ValidationError("El correo debe incluir @example.com")
- Define una validación por campo con validate_email.
- Retorna el valor cuando es válido.
- Lanza serializers.ValidationError cuando incumple la regla.
- El error se serializa como JSON y se responde con estado 400.
¿Qué hacer con validaciones de múltiples campos en serializers?
Cuando la regla depende de varios campos, se usa el método validate. Este recibe un diccionario con todos los atributos y permite cruzar información, por ejemplo validar que el teléfono sea válido antes de activar vacaciones del doctor.
from rest_framework import serializers
class DoctorSerializer(serializers.ModelSerializer):
class Meta:
model = Doctor
fields = ["email", "is_on_vacation", "contact_number"]
def validate(self, attrs):
contact_number = attrs.get("contact_number", "")
is_on_vacation = attrs.get("is_on_vacation")
# Requiere un número con al menos 10 caracteres si el doctor entra en vacaciones.
if is_on_vacation and len(contact_number) < 10:
raise serializers.ValidationError(
"Por favor, ingresa un número válido antes de irte a vacaciones"
)
return attrs
- La validación combina contact_number e is_on_vacation.
- Si falla, el error aparece como non_field_errors al no pertenecer a un campo específico.
- Si pasa, retorna attrs y el flujo continúa.
- Facilita reglas de negocio previas a cambios sensibles, como activar vacaciones.
¿Qué habilidades y conceptos refuerzas al implementar estas validaciones?
Desarrollas prácticas clave de calidad de datos y manejo de errores. Además, afinas el diseño de reglas de negocio dentro del serializer sin depender del modelo.
- Validación por campo con validate_email para políticas de dominio corporativo.
- Validación a nivel de objeto con validate para múltiples campos.
- Uso de serializers.ValidationError con mensajes claros para el cliente.
- Errores serializados como JSON y respuesta 400 cuando el dato es inválido.
- Gestión de reglas de negocio: solo emails @example.com, teléfono mínimo de 10 caracteres.
- Conceptos y keywords: serializer, serializers, JSON, patch, endpoint, backend, is_on_vacation, contact_number, non_field_errors.
- Beneficio directo: confiabilidad de datos y prevención de estados inconsistentes.
¿Qué validaciones personalizadas agregarías para pacientes u otros recursos? Comparte tus ideas y ejemplos en los comentarios.