如何在更改另一个字段时修改 pydantic 字段?
How to modify pydantic field when another one is changed?
我有一个狂妄的class例如:
from pydantic import BaseModel
class Programmer(BaseModel):
python_skill: float
Whosebug_skill: float
total_score: float = None
现在我根据其他字段计算total_score:
@validator("total_score", always=True)
def calculat_total_score(cls, v, *, values):
return values.get("python_skill") + values.get("Whosebug_skill")
这很好用,但现在当我改变其中一项技能时:
programmer = Programmer(python_skill=1.0, Whosebug_skill=9.0)
print(programmer.total_score) # return 10.0
programmer.python_skill=2.0
print(programmer.total_score) # still return 10.0
我希望total_score自动更新。
有什么解决办法吗?
TNX!!
您可以为此使用 root validator。每次更新后都会调用它。像这样:
from pydantic import BaseModel, validator, root_validator
class Programmer(BaseModel):
python_skill: float
Whosebug_skill: float
total_score: float = None
class Config:
validate_assignment = True
@root_validator
def calculate_total_score(cls, values):
values["total_score"] = values.get("python_skill") + values.get("Whosebug_skill")
return values
programmer = Programmer(python_skill=1.0, Whosebug_skill=9.0)
print(programmer.total_score) # 10.0
programmer.python_skill = 2.0
print(programmer.total_score) # 11.0
注:1.7.3之前的版本有bug,建议更新
我有一个狂妄的class例如:
from pydantic import BaseModel
class Programmer(BaseModel):
python_skill: float
Whosebug_skill: float
total_score: float = None
现在我根据其他字段计算total_score:
@validator("total_score", always=True)
def calculat_total_score(cls, v, *, values):
return values.get("python_skill") + values.get("Whosebug_skill")
这很好用,但现在当我改变其中一项技能时:
programmer = Programmer(python_skill=1.0, Whosebug_skill=9.0)
print(programmer.total_score) # return 10.0
programmer.python_skill=2.0
print(programmer.total_score) # still return 10.0
我希望total_score自动更新。
有什么解决办法吗? TNX!!
您可以为此使用 root validator。每次更新后都会调用它。像这样:
from pydantic import BaseModel, validator, root_validator
class Programmer(BaseModel):
python_skill: float
Whosebug_skill: float
total_score: float = None
class Config:
validate_assignment = True
@root_validator
def calculate_total_score(cls, values):
values["total_score"] = values.get("python_skill") + values.get("Whosebug_skill")
return values
programmer = Programmer(python_skill=1.0, Whosebug_skill=9.0)
print(programmer.total_score) # 10.0
programmer.python_skill = 2.0
print(programmer.total_score) # 11.0
注:1.7.3之前的版本有bug,建议更新