'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