如何基于其他字段设置Pydantic属性值?解决未绑定变量报错
问题代码
from pydantic import BaseModel class Grafana(BaseModel): user: str password: str host: str port: str api_key: str | None = None GRAFANA_URL = f"http://{user}:{password}@{host}:{port}" API_DATASOURCES = "/api/datasources" API_KEYS = "/api/auth/keys"
上述代码中GRAFANA_URL的定义会报错,因为类定义阶段无法直接引用实例字段user、password等。下面是几种可行的解决方法:
方法一:使用Pydantic v2的model_post_init
这是Pydantic v2推荐的实例初始化后执行逻辑的方式,类似普通类的__init__后续操作:
from pydantic import BaseModel class Grafana(BaseModel): user: str password: str host: str port: str api_key: str | None = None API_DATASOURCES = "/api/datasources" API_KEYS = "/api/auth/keys" def model_post_init(self, __context) -> None: self.GRAFANA_URL = f"http://{self.user}:{self.password}@{self.host}:{self.port}"
方法二:使用@property装饰器
把GRAFANA_URL定义为动态属性,每次访问时自动计算,适合字段可能被修改的场景:
from pydantic import BaseModel class Grafana(BaseModel): user: str password: str host: str port: str api_key: str | None = None API_DATASOURCES = "/api/datasources" API_KEYS = "/api/auth/keys" @property def GRAFANA_URL(self) -> str: return f"http://{self.user}:{self.password}@{self.host}:{self.port}"
方法三:Pydantic v1版本使用root_validator
如果还在使用Pydantic v1,可以通过根验证器来设置字段值:
from pydantic import BaseModel, root_validator class Grafana(BaseModel): user: str password: str host: str port: str api_key: str | None = None GRAFANA_URL: str API_DATASOURCES = "/api/datasources" API_KEYS = "/api/auth/keys" @root_validator(pre=False) def set_grafana_url(cls, values): values["GRAFANA_URL"] = f"http://{values['user']}:{values['password']}@{values['host']}:{values['port']}" return values
内容的提问来源于stack exchange,提问作者An old man in the sea.
相关产品推荐
相关产品推荐

