Как десериализовать вложенные модели Pydantic из JSON, где вложенные модели хранятся в списке в вычисляемом поле.Python

Программы на Python
Anonymous
Как десериализовать вложенные модели Pydantic из JSON, где вложенные модели хранятся в списке в вычисляемом поле.

Сообщение Anonymous »

У меня есть модель Pydantic, представляющая транзакции по хранению банковского счета, которые сами по себе являются моделями, вложенными в модель счета. Транзакции хранятся в списке в скрытом поле, и доступ к ним осуществляется через вычисляемое поле, которое применяет некоторые проверки в методе установки.
Упрощенные модели:

Код: Выделить всё

class Account(BaseModel):
id: UUID = Field(default_factory=uuid4)
owner: Customer
_transactions: List[Transaction] = list()

@fields.computed_field()
@property
def transactions(self) -> List[Transaction]:
return self._transactions

@transactions.setter
def transactions(self, list_: List[Transaction]) -> None:
# DO SOME CHECKS
self._transactions = sorted_list

class Transaction(BaseModel):
id: UUID = Field(default_factory=uuid4)
date: datetime.date = Field(frozen=False)
amount: PositiveFloat = Field(frozen=False)

class Customer(BaseModel):
id: UUID = Field(default_factory=uuid4)
name: datetime.date = Field(frozen=False)
Сериализация
Я могу успешно сериализовать учетную запись в JSON, включая транзакции:

Код: Выделить всё

x = my_account.model_dump_json()
x
Форматированный вывод:

Код: Выделить всё

'{
"id":"1eeed00b-3bd7-48fa-ab6a-6979618ef723",
"owner":{
"id":"0cad242dad03-492b-9c6b-86f0b75f9c00",
"name":"Bob"
},
"transactions":[
{"id":"42738f1d-e998-4add-94b8-713afe25b525","date":"2012-01-01","amount":1.0}
]
}'
Десериализация (неожиданное поведение)
Однако, когда я пытаюсь восстановить модель из строки JSON, поле транзакций остается пустым. Нет проблем с полем владельца, которое содержит вложенную модель клиента:

Код: Выделить всё

Account.model_validate_json(x)
Форматированный вывод:

Код: Выделить всё

Account(
id=UUID('1eeed00b-3bd7-48fa-ab6a-6979618ef723'),
owner=Customer(
id=UUID('0cad242d-ad03-492b-9c6b-86f0b75f9c00'),
name='Bob'
),
transactions=[]
)
Есть ли способ сделать обратимым процесс сериализации вычисляемого поля?

Подробнее здесь: https://stackoverflow.com/questions/784 ... s-are-held

Вернуться в «Python»