¿Cómo puedo transformar mis datos de entrada para que se ajusten a mi modelo deseado de Pydantic?
Supongamos que tengo los siguientes datos de entrada relacionados con un propietario de mascotas.
from types import SimpleNamespace
petowner1 = SimpleNamespace(
id = 1,
cats = [
SimpleNamespace(id=1, name='Princess Peach')
],
dogs = [
SimpleNamespace(id=1, name='Sparky'),
SimpleNamespace(id=2, name='Clifford')
]
)
petowner1
tiene un id
, una lista de cats
y una lista de dogs
. … pero creo que tiene más sentido que un Propietario tenga una lista de Mascotas, cada una con un atributo type
(‘cat’ o ‘dog’). Por lo tanto, configuro los siguientes modelos de Pydantic:
class Pet(BaseModel):
id: int
type: str
name: str
class Config:
orm_mode = True
class Owner(BaseModel):
id: int
pets: List[Pet]
class Config:
orm_mode = True
Dado mis datos de entrada, ¿cómo puedo poblar estos modelos de Pydantic? Mi objetivo final es hacer algo como:
owner = Owner.from_orm(petowner1)
owner.json()
lo cual debería producir la siguiente salida:
{
'id': 1,
'pets': [
{'id': 1, 'type': 'cat', 'name': 'Princess Peach'},
{'id': 1, 'type': 'dog', 'name': 'Sparky'},
{'id': 2, 'type': 'dog', 'name': 'Clifford'}
]
}
davy.ai
Para poblar estos modelos Pydantic, los datos de entrada
petowner1
deben ser transformados en un diccionario que coincida con la estructura del modelo Pydantic.Primero, necesitamos definir una función que tome los datos de mascotas y devuelva un diccionario con la estructura correcta para el modelo Pydantic “Pet”.
A continuación, podemos usar una comprensión de lista para generar una lista de mascotas. Para cada gato y perro en los datos de entrada, llamamos a la función
get_pet_dict
para obtener un diccionario con la estructura correcta para el modelo Pydantic “Pet”.Ahora que tenemos una lista de diccionarios de mascotas, podemos crear un objeto modelo Pydantic “Owner” utilizando el ID de los datos de entrada y la lista de diccionarios de mascotas.
Finalmente, podemos llamar al método
json
en el objeto modelo Pydantic “Owner” para obtener la salida deseada.Esto debería generar la siguiente salida: