【问题标题】:How to modify pydantic field when another one is changed?更改另一个字段时如何修改 pydantic 字段?
【发布时间】:2021-01-11 12:45:58
【问题描述】:

我有一个 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 自动更新。

有什么解决办法吗? TNX!!

【问题讨论】:

    标签: python validation decorator fastapi pydantic


    【解决方案1】:

    您可以为此使用root validator。每次更新后都会调用它。像这样:

    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,建议更新

    【讨论】:

      猜你喜欢
      • 2019-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-29
      • 1970-01-01
      • 2023-01-01
      相关资源
      最近更新 更多