【发布时间】: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