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"

使用PYDANIC,我在GRAFANA_URL中得到了两个未绑定变量的错误消息,分别对应于userpassword等.

有没有办法解决这个问题?在常规类中,我只会在__init__方法中创建GRAFANA_URL.对于皮丹蒂克,我不确定该如何继续.

推荐答案

Option A: Use a @validator

有关详情,请参阅validators documentation.

from typing import Any

from pydantic import BaseModel, validator


class Model(BaseModel):
    foo: str
    bar: str
    foobar: str = ""

    @validator("foobar", always=True)
    def set_if_empty(cls, v: str, values: dict[str, Any]) -> str:
        if v == "":
            return values["foo"] + values["bar"]
        return v


obj = Model(foo="a", bar="b")
print(obj)  # foo='a' bar='b' foobar='ab'

如此一来,foobar仍然是一个常规的模范领域.

请注意,要使其起作用,foobar必须定义为afterfoobar.否则你就得用root validator美元了.

Option B: Make it a @property

from pydantic import BaseModel


class Model(BaseModel):
    foo: str
    bar: str

    @property
    def foobar(self) -> str:
        return self.foo + self.bar


obj = Model(foo="a", bar="b")
print(obj)         # foo='a' bar='b'
print(obj.foobar)  # ab

foobar将不再是模型字段,因此不是模式的一部分.这可能与你相关,也可能与你无关.

Option C: Make it a @computed_field (Pydantic v2 only!)

Defining computed fields将适用于《平凡的2》.

from pydantic import BaseModel, computed_field


class Model(BaseModel):
    foo: str
    bar: str

    @computed_field
    @property
    def foobar(self) -> str:
        return self.foo + self.bar


obj = Model(foo="a", bar="b")
print(obj)         # foo='a' bar='b' foobar='ab'

Python相关问答推荐

Pandas 按照特殊规则保留每n行

如何使用scikit-learn Python库中的Agglomerative集群算法以及集群中声明的对象数量?

Django序列化器没有验证或保存数据

使用Curses for Python保存和恢复终端窗口内容

将词典写入Excel

将numpy数组与空数组相加

为什么基于条件的过滤会导致pandas中的空数据框架?

如何从FDaGrid实例中删除某些函数?

如何在Python中使用io.BytesIO写入现有缓冲区?

将DF中的名称与另一DF拆分并匹配并返回匹配的公司

Python多处理:当我在一个巨大的pandas数据框架上启动许多进程时,程序就会陷入困境

当多个值具有相同模式时返回空

Pystata:从Python并行运行stata实例

更改键盘按钮进入'

Polars:用氨纶的其他部分替换氨纶的部分

cv2.matchTemplate函数匹配失败

考虑到同一天和前2天的前2个数值,如何估算电力时间序列数据中的缺失值?

Flask Jinja2如果语句总是计算为false&

Python Pandas—时间序列—时间戳缺失时间精确在00:00

ruamel.yaml dump:如何阻止map标量值被移动到一个新的缩进行?