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

Pydantic联合鉴别器在FastAPI响应中未正常生效问题排查

问题原因与解决方案

问题出在继承关系下的联合类型序列化逻辑:ActivityWithMedia 是 Activity 的子类,即便你配置了 Discriminator(lambda...),Pydantic 在序列化时仍会优先以父类 Activity 的结构处理实例,导致子类特有的 media 字段被忽略。而 questions 的联合类型是平级无继承的,所以 union_mode="left_to_right" 能正常生效。

解决方法

方法一:显式添加鉴别字段(推荐)

给父类和子类添加固定的鉴别字段,让 Pydantic 通过字段值明确区分类型,确保序列化时包含子类字段:

from typing import Literal

class Activity(BaseModel):
    activity_key: ActivityKey
    activity_id: UUID = Field(default_factory=uuid4)
    questions: list[QuestionWithDistractors] | list[QuestionWithAnswer] = Field(union_mode="left_to_right")
    # 固定鉴别字段值,标识当前类型
    activity_type: Literal["activity"] = "activity"

class ActivityWithMedia(Activity):
    media: Media
    # 子类的鉴别字段值,与父类区分
    activity_type: Literal["activity_with_media"] = "activity_with_media"

class Lesson(BaseModel):
    lesson_id: UUID = Field(default_factory=uuid4)
    # 指定联合类型,并通过discriminator绑定鉴别字段
    activities: list[Activity | ActivityWithMedia] = Field(..., discriminator="activity_type")

方法二:临时兼容方案(不推荐)

若不想新增字段,可给 Activity 模型添加配置允许序列化额外字段,但会破坏模型的类型约束:

class Activity(BaseModel):
    activity_key: ActivityKey
    activity_id: UUID = Field(default_factory=uuid4)
    questions: list[QuestionWithDistractors] | list[QuestionWithAnswer] = Field(union_mode="left_to_right")
    
    model_config = ConfigDict(extra="allow")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 16:32:34