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
相关产品推荐
相关产品推荐

