I have an enum :
from enum import Enum
class MyEnum(Enum):
val1 = "val1"
val2 = "val2"
val3 = "val3"
I would like to validate a pydantic field based on that enum.
from pydantic import BaseModel
class MyModel(BaseModel):
my_enum_field: MyEnum
BUT I would like this validation to also accept string that are composed by the Enum members.
So for example : "val1_val2_val3" or "val1_val3" are valid input.
I cannot make this field as a string field with a validator since I use a test library (hypothesis and pydantic-factories) that needs this type in order to render one of the values from the enum (for mocking random inputs)
So this :
from pydantic import BaseModel, validator
class MyModel(BaseModel):
my_enum_field: str
@validator('my_enum_field', pre=True)
def validate_my_enum_field(cls, value):
split_val = str(value).split('_')
if not all(v in MyEnum._value2member_map_ for v in split_val):
raise ValueError()
return value
Could work, but break my test suites because the field is anymore of enum types.
How to keep this field as an Enum type (to make my mock structures still valid) and make pydantic accept composite values in the same time ?
So far, I tried to dynamically extend the enum, with no success.