Explanation of the title:

假设我们有以下PUDNIC模型的设置:

class ParametersA(BaseModel):
    param_a: str = Field(
        default=...,
        allow_mutation=False,
        exclude=False,
        description="some description.",
        extra={
            "additional_bool": False
        }
    )
    param_b: bool = Field(
        default=False,
        allow_mutation=True,
        exclude=False,
        description="some description.",
        extra={
            "additional_bool": False
        }
    )
    # many more parameters of all types with additional constaints (le, gt, max_items,...)

class ParametersB(BaseModel):
    param_c: float = Field(
        default=-22.0,
        exclude=False,
        allow_mutation=True,
        description="some floaty description",
        gt=-180.0,
        le=0.0,
        extra={
            "additional_bool": False,
            "unit": "degree"
        }
    )
    param_d: List[str] = Field(
        default=["auto"],
        exclude=False, 
        allow_mutation=True,
        min_items=1,
        max_items=4,
        unique_items=True,
        description="Some listy description.",
        extra={
            "auto_mode_available": False
        }
    )
    # many more parameters of all types with additional constaints (le, gt, max_items,...)

这两个模型是另一个BaseModel个模型中的领域:

class FullModelX(BaseModel):
    parameters_A: ParametersA
    parameters_B: ParametersB

问题是,是否有可能创造另一种模式:

class FullModelY(BaseModel):
    parameters_A: ParametersA
    parameters_B: ParametersB

哪些可以重用类ParametersAParametersB,但具有不同的验证限制和不同的元数据?例如,在FullModelX中,ParametersA中的param_b的缺省值可能是False,而在FullModelX中应该是True.同样的情况也适用于任何其他FieldInfo处房产,如excludegtle等等.

到目前为止,我唯一的解决方案是在每次需要其他验证约束时复制ParametersAParametersB.

推荐答案

是的,您可以通过使用继承和更新字段的配置来创建同一个Pydtic BaseModel的不同版本.为此,您可以创建原始BaseModel(S)的子类并使用Field函数更新字段配置.这样,您不需要复制整个模型,而只需根据需要覆盖和更新特定的字段属性.

以下是一个如何通过创建ParametersAParametersB的变体来实现这一点的示例:

from pydantic import BaseModel, Field
from typing import List

class ParametersA(BaseModel):
    # Original ParametersA model definition
    ...

class ParametersAVariant(ParametersA):
    param_a: str = Field(default="new_default_value")
    param_b: bool = Field(default=True)

class ParametersB(BaseModel):
    # Original ParametersB model definition
    ...

class ParametersBVariant(ParametersB):
    param_c: float = Field(default=-33.0, gt=-200.0, le=-30.0)

class FullModelX(BaseModel):
    parameters_A: ParametersA
    parameters_B: ParametersB

class FullModelY(BaseModel):
    parameters_A: ParametersAVariant
    parameters_B: ParametersBVariant

在本例中,FullModelY使用ParametersAVariantParametersBVariant子类,这些子类继承自原始的ParametersAParametersB模型.我们已经覆盖和更新了这些子类中特定字段的默认值和其他属性.

Python相关问答推荐

从流程获取定期更新

两极按组颠倒顺序

PyTorch卷积自动编码器,输出维度与输入不同

在后台运行的Python函数

如何在Power Query中按名称和时间总和进行分组

在Docker中运行HAProxy时无法获得503服务

如何处理必须存在于环境中但无法安装的Python项目依赖项?

自定义新元未更新参数

使文本输入中的文本与标签中的文本相同

计算所有前面行(当前行)中列的值

使用polars .滤镜进行切片速度比pandas .loc慢

根据在同一数据框中的查找向数据框添加值

运行终端命令时出现问题:pip start anonymous"

如何记录脚本输出

如何让这个星型模式在Python中只使用一个for循环?

Pandas DataFrame中行之间的差异

如何更新pandas DataFrame上列标题的de值?

如何在PySide/Qt QColumbnView中删除列

如何在BeautifulSoup/CSS Select 器中处理regex?

循环浏览每个客户记录,以获取他们来自的第一个/最后一个渠道