【问题标题】:FastAPI: How to use enums for the BaseModel schemaFastAPI:如何将枚举用于 BaseModel 架构
【发布时间】:2022-09-23 19:30:18
【问题描述】:

我想在我的 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: 1 validation error for IdentificationRequestBase response -> 0 -> gender field required (type=value_error.missing)

    标签: python enums database-schema fastapi mode


    【解决方案1】:

    您是否尝试过将默认设置简单地设置为字符串:

        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]
    

    【讨论】:

    • 感谢您的回答!我试过你的建议,但没有帮助。
    【解决方案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
    

    【讨论】:

      【解决方案3】:

      我有同样的问题,这就是我能够解决它的方法。

      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
      

      【讨论】:

        【解决方案4】:

        对于 MongoDB,请遵循以下步骤:

        1.创建schema.py文件

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

        2.下次使用性别主 BaseModel 中的类

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

        3.现在使用用户类在你的 main.py 文件中

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-10-02
          • 2017-11-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-16
          • 1970-01-01
          相关资源
          最近更新 更多