'FastAPI: How to use enums for the BaseModel schema
I want to use a enum field at my FastAPI model. This is my model:
import enum
from sqlalchemy import Column, Enum, Integer, String
class Gender(enum.Enum):
FEMALE = "FEMALE"
MALE = "MALE"
...
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
name = Column(String)
gender Column(Enum(Gender), default=Gender.FEMALE)
And this is my schema:
from enum import Enum
from pydantic import BaseModel
class Gender(str, Enum):
FEMALE = 'FEMALE'
MALE = 'MALE'
...
class User(BaseModel):
id: int
name: str
gender: Gender
class Config:
orm_mode = True
I get the error message value is not a valid enumeration member; permitted: 'FEMALE', 'MALE' (type=type_error.enum; enum_values=[<Gender.FEMALE: 'FEMALE'>, <Gender.MALE: 'MALE'>]).
Update:
Now I get the error message: pydantic.error_wrappers.ValidationError: 1 validation error for IdentificationRequestBase response -> 0 -> gender field required (type=value_error.missing).
Solution 1:[1]
Have you tried setting the default simply as a string:
gender = Column(Enum(Gender), default="FEMALE")
If that still does not help, try to change default to server_default:
gender = Column(Enum(Gender), server_default="FEMALE")
If you want to default to None for the schema, you can also make the field optional:
from typing import Optional
class User(BaseModel):
gender: Optional[Gender]
Solution 2:[2]
Try creating a file called enums.py where you only declare Gender:
from enum import Enum, unique
@unique
class Gender(Enum):
FEMALE = "FEMALE"
MALE = "MALE"
And then in your models use it like this:
from enums import Gender
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
name = Column(String)
gender = Column(Enum(Gender), default=Gender.FEMALE)
And in your schemas try this:
class User(BaseModel):
id: int
name: str
gender: Gender
class Config:
orm_mode = True
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 |
