在 pydantic 模型中包含可能的枚举值
Include possible enum values in pydantic model
我有一个包含枚举值的模型 ModelWithEnum
。除了该值之外,我还希望模型从该枚举中输出所有可能的值(这些枚举类似于范围,例如 A、B、C;A、B、C、D 等)。
我制作了 EnumModel
一个 GenericModel,因为我不想为每个 Enum class 创建一个新模型。我正在使用仿制药迈出第一步,但不确定我是否在正确的轨道上。
这是我想要实现的目标
# `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
您可以使用 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
我有一个包含枚举值的模型 ModelWithEnum
。除了该值之外,我还希望模型从该枚举中输出所有可能的值(这些枚举类似于范围,例如 A、B、C;A、B、C、D 等)。
我制作了 EnumModel
一个 GenericModel,因为我不想为每个 Enum class 创建一个新模型。我正在使用仿制药迈出第一步,但不确定我是否在正确的轨道上。
这是我想要实现的目标
# `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
您可以使用 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