Я изучаю pydantic и хочу понять взаимодействие между классами Python и их свойствами с моделями pydantic.
В частности, я хочу определить некоторые вычисляемые переменные экземпляра лениво во время выполнения после создания модели и каждый раз при обновлении модели или определенного поля. Вот небольшой фрагмент игрового кода.
Вопрос: как я могу запрограммировать это каждый раз, когда я меняю дату рождения или возраст (при условии, что последний можно вычислить по заданному значению), а затем переоценить is_adult?
Могу ли я добиться этого с помощью только декоратора @properties Python и @computed_field Pyndatic или мне придется использовать @model_validator< /code> декоратор Pyndatic, чтобы получить такое поведение ловушки?
from typing import Optional
from pydantic import BaseModel, model_validator, field_validator, computed_field
from datetime import datetime
class Person(BaseModel):
name: Optional[str]
birthdate: Optional[datetime]
_children_names: list[str] = []
@computed_field
@property
def children_names(self) -> list[str]:
return self._children_names
@children_names.setter
def children_names(self, values: list[str]):
self._children_names += values
@computed_field
@property
def is_adult(self) -> bool:
return self.age >= 18
@model_validator(mode="after")
def compute_age(cls, values):
birthdate = values.birthdate
values.age = datetime.today().year - birthdate.year
return values
if __name__ == "__main__":
person = {
"name": "Luca",
"birthdate": "1993-01-30",
}
p = Person.model_validate(person)
Подробнее здесь: https://stackoverflow.com/questions/787 ... a-field-is