Serialización de Datos
Explora los mecanismos para exportar tus modelos a diccionarios o formato JSON. Este capítulo cubre la exclusión de campos, la serialización condicional y la transformación de tipos complejos a cadenas.
Este capítulo aborda la transformación de modelos de Pydantic V2 en estructuras externas para el intercambio y almacenamiento de información. A través del motor de alto rendimiento en Rust, aprenderás a exportar datos de forma precisa hacia diccionarios nativos de Python y cadenas de texto en formato JSON. Descubrirás cómo controlar la salida mediante el filtrado dinámico o estático de atributos sensibles, el uso de alias de salida y la creación de serializadores a medida con el decorador @field_serializer para adaptar los flujos a cualquier regla de negocio.
8.1. Exportación a diccionarios
En Pydantic V2, la conversión de una instancia de modelo en un diccionario nativo de Python es un proceso optimizado que se realiza principalmente a través del método model_dump(). Este método sustituye al antiguo método .dict() de Pydantic V1, ofreciendo un rendimiento significativamente mayor gracias al motor interno escrito en Rust (pydantic-core).
Cuando exportas un modelo a un diccionario, Pydantic procesa cada atributo, ejecuta los serializadores correspondientes y genera una estructura de datos compuesta por tipos primitivos de Python (cadenas, enteros, flotantes, booleanos, listas, tuplas y diccionarios).
El método model_dump()
La forma más directa de transformar un modelo es invocar model_dump() sin argumentos. Esto exportará todos los campos del modelo con sus valores actuales.
Python
Flujo de serialización estándar
El siguiente diagrama en texto plano ilustra cómo viajan los datos desde la instancia del modelo de Pydantic hasta el diccionario final de Python:
TEXT
Configuración del modo de volcado: mode
El método model_dump() acepta un parámetro clave llamado mode. Este parámetro determina el nivel de transformación que sufrirán los datos complejos (como objetos datetime, UUID o Url) durante la exportación. Sus dos opciones principales son:
mode='python'(por defecto): Conserva los objetos de Python en su tipo nativo siempre que sea posible. Por ejemplo, un objetodatetime.datese mantendrá como un objetodatedentro del diccionario resultante.mode='json': Convierte todos los campos a tipos de datos estrictamente compatibles con el estándar JSON. Los objetosdatetimese transformarán en cadenas de texto ISO-8601, losUUIDen cadenas, etc.
Python
Conservación de alias de salida: by_alias
Si tu modelo define alias para los campos mediante el uso de Field(serialization_alias=...) o Field(alias=...), puedes indicarle a Pydantic que utilice estos nombres alternativos como claves del diccionario en lugar de los nombres de las variables en Python. Esto se logra asignando by_alias=True.
Python
Control de valores no asignados: exclude_unset
Por defecto, model_dump() exportará todos los campos definidos en el modelo, utilizando sus valores predeterminados si no se proporcionaron explícitamente durante la inicialización. Si deseas exportar únicamente los campos que el usuario proporcionó de forma expresa al crear la instancia, debes utilizar exclude_unset=True.
Python
Control de valores por defecto y nulos: exclude_defaults y exclude_none
Pydantic ofrece dos filtros booleanos adicionales para refinar el contenido del diccionario de salida:
exclude_defaults=True: Omite cualquier campo cuyo valor actual sea exactamente igual al valor predeterminado definido en la declaración del modelo.exclude_none=True: Elimina del diccionario resultante todas las claves cuyo valor seaNone.
Python
8.2. Generación de cadenas JSON
Mientras que model_dump() exporta las instancias de tus modelos a estructuras de diccionarios de Python, el método model_dump_json() realiza la serialización directa de la instancia a una cadena de texto en formato JSON (str).
En Pydantic V2, este proceso es sumamente eficiente debido a que la conversión a JSON se ejecuta directamente en código nativo de Rust a través de pydantic-core. Esto evita el paso intermedio de construir un diccionario en Python y luego pasarlo por la biblioteca estándar json.dumps(), reduciendo drásticamente el consumo de memoria y los tiempos de CPU.
El método model_dump_json()
La invocación básica de model_dump_json() genera una cadena de texto compacta que contiene la representación JSON serializada de todos los atributos del modelo.
Python
Arquitectura de serialización JSON
El siguiente diagrama muestra la diferencia de rutas entre la serialización tradicional utilizando diccionarios intermedios y la serialización directa nativa de Pydantic V2:
TEXT
Formateo visual: indent
Por defecto, la cadena JSON se genera en una sola línea sin espacios redundantes para minimizar el tamaño de transferencia de datos. Si necesitas que la salida sea legible para humanos (por ejemplo, para escribir archivos de configuración o imprimir en logs de depuración), puedes usar el parámetro indent. Este acepta un entero que define el número de espacios por nivel de anidamiento.
Python
Parámetros heredados de control de flujo
model_dump_json() comparte gran parte de la firma de argumentos de model_dump(). La lógica de filtrado opera exactamente igual, pero aplicando las restricciones directamente durante la codificación a texto:
by_alias=True: Reemplaza las propiedades de Python por sus respectivosserialization_aliasen las claves de la cadena JSON.exclude_unset=True: Omite del JSON final aquellos campos que no fueron inicializados explícitamente por el usuario.exclude_defaults=True: Excluye las propiedades cuyos valores coincidan con los asignados por defecto en el modelo.exclude_none=True: Remueve del JSON las propiedades que contengan el valornullde JavaScript/JSON (equivalente alNonede Python).
Python
Nota de compatibilidad: A diferencia de
model_dump(), el métodomodel_dump_json()no posee un parámetromode. Esto se debe a que su única finalidad es producir texto JSON legal, por lo que actúa implícitamente bajo el comportamiento equivalente amode='json', transformando automáticamente tipos complejos (como fechas o datos binarios) a sus representaciones válidas en formato de texto estándar.
8.3. Exclusión de atributos
Durante el proceso de serialización hacia diccionarios o cadenas JSON, es frecuente requerir que ciertos atributos sensibles o temporales no se incluyan en la estructura final de salida (como contraseñas, tokens de sesión o cálculos internos). Pydantic ofrece dos mecanismos principales para lograrlo: el filtrado dinámico en el momento del volcado utilizando los parámetros include y exclude, y la configuración estática a nivel de campo mediante el uso de la función Field().
Filtrado dinámico: Parámetros include y exclude
Tanto model_dump() como model_dump_json() aceptan los argumentos opcionales include y exclude. Estos parámetros esperan un conjunto (set) de cadenas de texto con los nombres de las propiedades que deseas aislar.
include: Especifica de forma estricta los únicos campos que deben formar parte de la exportación. Cualquier atributo que no se liste aquí será omitido.exclude: Especifica los campos concretos que deben dejarse fuera del resultado. Todos los demás atributos que no estén en el conjunto se exportarán normalmente.
Python
Exclusión en modelos anidados (Sintaxis de Diccionario)
Cuando trabajas con modelos complejos que contienen submodelos, un conjunto simple de cadenas solo aplicará al modelo raíz. Si necesitas filtrar propiedades dentro de un objeto anidado, debes pasar un diccionario al parámetro include o exclude. En este diccionario, las claves representan las propiedades del modelo superior y los valores definen los filtros para los submodelos (usando un set o un nuevo diccionario anidado).
Python
Exclusión estática permanente con Field()
Si un atributo nunca debe ser expuesto durante la serialización, la mejor práctica consiste en definirlo directamente en el esquema del modelo utilizando la función Field() junto con el argumento exclude=True.
Al hacer esto, el campo participará con normalidad en las etapas de inicialización y validación de datos de entrada, pero se omitirá de forma automática y permanente en cualquier llamada a model_dump() o model_dump_json(), sin necesidad de pasar parámetros manuales en cada exportación.
Python
El siguiente diagrama resume cómo interactúan los filtros dinámicos y estáticos durante el ciclo de vida de los datos al exportar un modelo:
TEXT
8.4. Serializadores a medida
Pydantic permite modificar por completo la forma en que los campos de un modelo se transforman a diccionarios o cadenas JSON. Aunque la conversión por defecto cubre la mayoría de los escenarios, existen casos donde se requiere un control absoluto sobre la salida, como formatear una moneda, alterar la estructura de fechas o transformar objetos de librerías externas que Pydantic no reconoce de forma nativa.
Para definir esta lógica personalizada, Pydantic V2 introduce el decorador field_serializer.
El decorador field_serializer
El decorador @field_serializer se aplica sobre métodos dentro del modelo para interceptar el proceso de volcado (model_dump y model_dump_json) de un campo específico. El método decorado recibe como primer argumento el valor actual del campo y debe retornar el dato ya transformado en su nuevo formato listo para la serialización.
Python
Configuración del comportamiento: El parámetro mode
Al igual que en la validación, el decorador field_serializer acepta un parámetro mode que define el comportamiento del flujo de exportación:
mode='plain'(por defecto): Reemplaza por completo el serializador interno de Pydantic. Tu función es la única responsable de transformar el valor desde su tipo original hasta el tipo primitivo final.mode='wrap': Envuelve el serializador por defecto de Pydantic. Tu función recibe el valor del campo y un objeto manejador (SerializerFunctionWrapHandler). Esto te permite dejar que Pydantic haga el trabajo duro inicial y luego modificar el resultado, o aplicar lógica condicional.
Serialización condicional según el formato (Python vs JSON)
Una de las ventajas más potentes de @field_serializer es la capacidad de inspeccionar el contexto de la serialización mediante el uso del parámetro especial FieldSerializationInfo. Esto te permite devolver un tipo de dato diferente si el usuario ejecutó un volcado a un diccionario nativo (model_dump()) o a una cadena de texto (model_dump_json()).
El siguiente ejemplo muestra cómo conservar un tipo de dato estructurado en Python pero transformarlo a un formato plano y optimizado al generar un JSON:
Python
El flujo de decisiones dentro del serializador condicional se puede visualizar de la siguiente manera:
TEXT
Resumen del capítulo
En este capítulo hemos explorado en profundidad las herramientas de Serialización de Datos que ofrece Pydantic V2 para la exportación de modelos:
- Exportación a diccionarios (
8.1): Aprendimos a utilizarmodel_dump()para generar diccionarios tradicionales de Python, controlando la transformación de objetos complejos mediante el parámetromodey gestionando claves alternativas conby_alias. - Generación de cadenas JSON (
8.2): Analizamos el métodomodel_dump_json()y cómo su integración nativa con el motor en Rust evita pasos intermedios, agilizando la creación de cadenas de texto estructuradas de forma directa y eficiente. - Exclusión de atributos (
8.3): Revisamos los mecanismos para restringir datos salientes de manera dinámica en el momento del volcado medianteinclude/exclude, y de forma estática y permanente utilizando la propiedadexclude=Trueen la declaración de campos conField(). - Serializadores a medida (
8.4): Estudiamos el uso del decorador@field_serializerpara interceptar y reescribir los valores salientes, dándonos el poder de adaptar las respuestas según las necesidades del negocio o el formato final de exportación.
© 2026 Esdocu. Contenido bajo licencia MIT.
Editar esta página