You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用FastAPI与Pydantic时遇'__fields_set__'属性缺失错误求助

解决Pydantic BaseModel的__fields_set__属性错误

这个错误的核心原因是代码中把非Pydantic模型对象(比如枚举实例)当成了BaseModel实例来处理,或者BaseModel的使用方式不符合规范。结合你的FastAPI+枚举+请求体场景,给出以下针对性解决步骤:

1. 确保请求体模型的正确定义

枚举是用来限定字段可选值的类型,请求体必须由继承自BaseModel的类来包裹,正确结构示例:

from enum import Enum
from pydantic import BaseModel
from fastapi import FastAPI

app = FastAPI()

# 定义枚举类型
class ItemType(Enum):
    POTION = "potion"
    WEAPON = "weapon"
    ARMOR = "armor"

# 定义请求体模型,用枚举作为字段类型
class MagicItem(BaseModel):
    item_type: ItemType
    name: str
    power: int

2. 修正端点参数和实例化方式

  • POST端点必须接收MagicItem作为请求体参数,而非直接接收枚举类:
    @app.post("/magic-item/")
    async def create_magic_item(item: MagicItem):
        # 模拟数据库调用逻辑
        return {"status": "saved", "item": item.dict()}
    
  • 初始化MagicItem实例时,必须用键值对传参,不能直接把枚举实例作为位置参数传入:
    错误写法:
    # 错误:会触发__fields_set__缺失错误
    bad_item = MagicItem(ItemType.POTION, "Healing Potion", 50)
    
    正确写法:
    # 正确:明确指定字段名
    good_item = MagicItem(item_type=ItemType.POTION, name="Healing Potion", power=50)
    

3. 规范数据库模拟的返回值

如果测试/数据库方法返回的是枚举实例,FastAPI会尝试将其当作Pydantic模型序列化,从而触发错误。确保返回的是MagicItem实例或者序列化后的字典:

def mock_db_save(item: MagicItem):
    # 模拟保存逻辑
    return item.dict()

4. 排查Pydantic版本问题

若使用较旧的Pydantic v1版本,枚举与BaseModel的组合可能存在兼容性bug:

  • 升级到Pydantic v1最新稳定版:pip install --upgrade pydantic
  • 或切换到Pydantic v2(注意v2部分API调整,比如dict()方法改为model_dump())

内容的提问来源于stack exchange,提问作者BrunoX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 14:25:27