FastAPI:如何在BaseModel模式中使用枚举(enum)

3

我想在我的FastAPI模型中使用枚举字段。这是我的模型:

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)

以下是我的架构:

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

我收到了错误信息:value is not a valid enumeration member; permitted: 'FEMALE', 'MALE' (type=type_error.enum; enum_values=[<Gender.FEMALE: 'FEMALE'>, <Gender.MALE: 'MALE'>])更新: 现在我收到了错误信息:pydantic.error_wrappers.ValidationError: IdentificationRequestBase 响应的1个验证错误-> 0 -> 性别字段必需 (type=value_error.missing)

未来的读者可能会发现这个答案这个答案有帮助。 - undefined
4个回答

2

尝试创建一个名为enums.py的文件,在其中仅声明Gender:

from enum import Enum, unique


@unique
class Gender(Enum):
    FEMALE = "FEMALE"
    MALE = "MALE"

然后在你的模型中像这样使用它:

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)

在您的模式中尝试以下操作:

class User(BaseModel):
id: int
name: str
gender: Gender

class Config:
    orm_mode = True

2

如果您需要使用MongoDB,请按照以下步骤操作:

1.创建一个schema.py文件。

from enum import Enum

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

2.接下来在您的主要基础模型中使用Gender

class User(BaseModel):
    name: str
    gender: Gender

        

3.现在在你的main.py文件中使用用户类(User class)


0

我曾经遇到过同样的问题,这是我解决它的方法。

your_schemas.py文件中导入your_model.py文件中的Gender

下面是your_schemas.py文件的示例代码:

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

0

你尝试过将默认值设置为字符串吗:

    gender = Column(Enum(Gender), default="FEMALE")

如果仍然没有帮助,请尝试将default更改为server_default
    gender = Column(Enum(Gender), server_default="FEMALE")

如果您想要将模式默认设置为None,您也可以将字段设置为可选:

from typing import Optional

class User(BaseModel):

        gender: Optional[Gender]

谢谢你的回答!我尝试了你的建议,但是没有帮助。 - ikreb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接