python - 更改另一个字段时如何修改 pydantic 字段?
问题描述
我有一个 pydantic 类,例如:
from pydantic import BaseModel
class Programmer(BaseModel):
python_skill: float
stackoverflow_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("stackoverflow_skill")
这很好用,但是现在当我更改其中一项技能时:
programmer = Programmer(python_skill=1.0, stackoverflow_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 自动更新。
有什么解决办法吗?天呐!!
解决方案
您可以为此使用根验证器。每次更新后都会调用它。像这样:
from pydantic import BaseModel, validator, root_validator
class Programmer(BaseModel):
python_skill: float
stackoverflow_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("stackoverflow_skill")
return values
programmer = Programmer(python_skill=1.0, stackoverflow_skill=9.0)
print(programmer.total_score) # 10.0
programmer.python_skill = 2.0
print(programmer.total_score) # 11.0
注意: 1.7.3之前的版本有bug ,建议更新
推荐阅读
- php - symfony - 如何进行路由
- c# - 在 MouseOver 上重绘按钮图形或单击
- c# - C# 分配列表
.Count 减一到整数不起作用 - spring-boot - 在 Spring Boot WebMvcConfigurer 中允许 CORS 时,请求的资源上不存在“Access-Control-Allow-Origin”标头
- javascript - 使用预签名 URL 上传后,AWS S3 上的文件在文件中有额外信息
- reactjs - 在 formik 组件之外处理 formik 表单
- javascript - 空手道 DSL - 如何从 __arg 读取令牌字符串并在 json 请求中发送此字符串?
- python-3.x - Python 3.7:GridSearchCV 和 RandomizedSearch CV 上的 ValueError - 输入包含 NaN、无穷大或对于 dtype('float32') 来说太大的值。-
- python - 无法使用 Selenium (Python) 检索脚本执行的 html 源
- python - Cython 无法识别 pymalloc Python