【问题标题】:Include possible enum values in pydantic model在 pydantic 模型中包含可能的枚举值
【发布时间】:2021-09-16 20:29:45
【问题描述】:

我有一个模型ModelWithEnum,它包含一个枚举值。除了该值之外,我希望模型从该枚举中输出所有可能的值(这些枚举类似于范围,例如 A、B、C;A、B、C、D 等)。

我将EnumModel 设为 GenericModel,因为我不希望每个 Enum 类都有一个新模型。我正在使用仿制药迈出第一步,但不确定我是否走在正确的轨道上。

这就是我想要实现的目标

# `ModelWithEnum` holds a `enum` field of type `EnumsAC`,
# so possible enum values would be "A", "B", "C"
model = ModelWithEnum(enum={"value": "A"})

assert model.enum.value == "A"
assert model.enum.possible_values == ["A", "B", "C"]

完整示例代码:

from enum import Enum
from typing import Generic, List, Optional, TypeVar
from pydantic.generics import GenericModel
from pydantic import BaseModel

EnumT = TypeVar("EnumT")


class EnumsAC(str, Enum):
    A = "A"
    B = "B"
    C = "C"


class EnumsAE(str, Enum):
    """Another Enums class"""

    A = "A"
    B = "B"
    C = "C"
    D = "D"
    E = "E"


class EnumModel(GenericModel, Generic[EnumT]):
    value: EnumT
    # How can I auto-fill this list with all possible values from EnumT
    # like if I hardcoded e.g. `list(EnumsAC)`
    possible_values: List[str] = []


class ModelWithEnum(BaseModel):
    enum: EnumModel[EnumsAC]

# `ModelWithEnum` holds a `enum` field of type `EnumsAC`,
# so possible enum values would be "A", "B", "C"
model = ModelWithEnum(enum={"value": "A"})

assert model.enum.value == "A" # ok
assert model.enum.possible_values == ["A", "B", "C"] # fails

【问题讨论】:

    标签: python generics enums pydantic


    【解决方案1】:

    您可以使用root_validator 来自动完成可能的值。以您的模型为例:

    class EnumModel(GenericModel, Generic[EnumT]):
        value: EnumT
        possible_values: List[str] = []
    
        class Config:
            validate_assignment = True
    
        @root_validator
        def root_validate(cls, values):
            values["possible_values"] = [item for item in values['value'].__class__]
            return values
    

    【讨论】:

    • 漂亮! validate_assignment 在这里有什么不同?我不太明白文档中的描述:“是否对属性的赋值进行验证(默认值:False)”
    • 设置验证器是否会在为字段分配新值时启动,而不仅仅是在创建对象时
    猜你喜欢
    • 1970-01-01
    • 2017-04-01
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 2018-11-02
    • 1970-01-01
    相关资源
    最近更新 更多