Привет.
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]))