FastAPI: How to use enums for the BaseModel schema

Viewed 1297

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).

4 Answers

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]

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

I had the same issue and this is how I was able to fix it.

import Gender from your_model.py file in your_schemas.py file

this is how your_schemas.py file should look like

from 'your_model' import Gender
from pydantic import BaseModel


class User(BaseModel):
    id: int
    name: str
    gender: Gender #from 'your_model.py'

    class Config:
        orm_mode = True

For MongoDB follow this :

1.Create schema.py file

from enum import Enum

class Gender(str,Enum):
Male = 'Male'
Female = "Female"

2.Next use Gender class in your main BaseModel

class User(BaseModel):
name:str

gender : Gender

        

3.Now use User class in you main.py file

Related