У меня есть перечисление:
class DataType(Enum):
TIMESTAMP = MyClass("ts")
DATETIME = MyClass("dt")
DATE = MyClass("date")
и модель Pydantic с полем типа этого Enum:
class Aggregation(BaseModel):
field_data_type: DataType
Есть ли удобный способ указать Pydantic проверять поле модели на соответствие именам перечисления, а не значениям? то есть, чтобы иметь возможность построить эту Модель:
agg = Aggregation(field_data_type = "TIMESTAMP")
но у меня есть 20 имен перечислений, это приведет к ненужному дублированию кода
Эти перечисления имеют разные цели, это не дублирование, а способ сделать ваши перечисления ответственными за что-то одно. Любые обертки над перечислениями только запутают других разработчиков, даже если они займут на несколько строк кода меньше.
Более того, вы увеличиваете вероятность появления ошибки. Конечно, это всего лишь рекомендация, и окончательное решение за вами!






Для этого вы можете использовать встроенную функциональность Enum:
agg = Aggregation(field_data_type=DataType["TIMESTAMP"])
Вы можете обернуть это в функцию, а затем создать новый аннотированный тип, который ее вызывает:
def convert_to_data_type(s: str):
return DataType[s]
StrDataType = Annotated[str, AfterValidator(convert_to_data_type)]
class Aggregation(BaseModel):
field_data_type: StrDataType
agg = Aggregation(field_data_type = "TIMESTAMP")
Я не знаю, в чем именно ваш случай, но я бы сказал, что создание двух перечислений вместо одного в такой ситуации — гораздо лучшая практика. Это может быть что-то вроде:
class DataType(Enum): TIMESTAMP = "TIMESTAMP"иclass DataTypeAPI(Enum): TIMESTAMP = "ts"