@glukonator

Pydantic. Как сериализовать список моделей?

Привет.

pydantic 2.0
python 3.10

from json import dumps
from pydantic import (
    AliasPath,
    BaseModel,
    Field,
)


class ObjPhone(BaseModel):
    phone: str | None = Field(default=None, validation_alias='formatted')


# class ObjPhones(BaseModel):
#     root: list[ObjPhone]


class ObjData(BaseModel):
    phones: list[ObjPhone] = Field(default=None, validation_alias='Phones')
    # phones: ObjPhones = Field(default=None, validation_alias='Phones')

    # @field_serializer('phones')
    # def serialize_phones(self, phones: list[ObjPhone], _info):
    #     return 'OOPS'


class Feature(BaseModel):
    props: ObjData = Field(validation_alias=AliasPath('properties', 'CompanyMetaData'))


class Response(BaseModel):
    features: list[Feature]


data = {
    "features": [
        {
            "properties": {
                "CompanyMetaData": {
                    "Phones": [
                        {"type": "phone", "formatted": "+1 (111) 111-11-11"},
                        {"type": "phone", "formatted": "+2 (222) 222-22-22"},
                    ],
                },
            },
        }, ]
}

if __name__ == '__main__':
    o = Response(**data)
    print(o.model_dump())
    print(dumps(o.features[0].props.phones))


на втором принте ошибка
TypeError: Object of type ObjPhone is not JSON serializable


1) можно конечно сначала сериализовать всю модель, а потом топать по ключам полученного словаря, но ИМХО такое себе..
2) мне кажется норм решение где-то рядом с попыткой сделать телефоны через ObjPhones, но получаю ошибку
features.0.properties.CompanyMetaData.Phones
  Input should be a valid dictionary or instance of ObjPhones [type=model_type, input_value=[{'type': 'phone', 'forma...: '+2 (222) 222-22-22'}], input_type=list]


UPD
хочется что-то поизящней, чем
print(dumps([phone.model_dump() for phone in o.features[0].props.phones]))
  • Вопрос задан
  • 675 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы