es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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'}
    ]
}
Tags:  ,

Answer

  1. Avatar for 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”.

    def get_pet_dict(pet_type: str, pet_data: SimpleNamespace) -> dict:
        return {
            "id": pet_data.id,
            "type": pet_type,
            "name": pet_data.name,
        }
    

    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”.

    cat_data = petowner1.cats
    dog_data = petowner1.dogs
    pets_data = [
        get_pet_dict("cat", cat_data[0]),
        *[get_pet_dict("dog", dog) for dog in dog_data],
    ]
    

    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.

    owner_dict = {"id": petowner1.id, "pets": pets_data}
    owner = Owner(**owner_dict)
    

    Finalmente, podemos llamar al método json en el objeto modelo Pydantic “Owner” para obtener la salida deseada.

    owner.json()
    

    Esto debería generar 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"}
        ]
    }
    

Comments are closed.