pydantic 2.9 的响应模型里 status 用 Enum 定义,直接 model_dump() 得到的是枚举对象,加上 mode=json 又变成取值字符串,下游按枚举名做分支全部落空。

原因不止一个,得分开看。2.x 默认按 python 模式返回枚举对象而不是字符串;use_enum_values 在不同小版本的行为有差异;同一个模型里混用了 Enum 与 Literal 两种写法;FastAPI 的自动序列化把差异掩盖了。

动手时先看两种 dump 的实际差别

python -c "from pydantic import BaseModel;from enum import Enum;print('see dump_demo.py')"

再往下在模型配置里固定枚举行为

python dump_demo.py --use-enum-values

出口处显式按 json 模式序列化

python dump_demo.py --mode json

末了用断言锁住字段类型

python -c "import json;d=json.load(open('out.json'));assert isinstance(d['status'],str);print('ok')"

命令输出我都留了记录,免得改完记不清原来的值。

改之前先确认了最近有没有人动过配置,避免白查一遍。

这次没动代码,只在配置和运行环境上找原因。

恢复的判定其实很直接。下游拿到的 status 是可枚举的字符串,FastAPI 返回体与直接 dump 的结果一致,单测断言通过。

pydantic 2 的 dump 模式差异容易被框架的自动序列化掩盖,单测里要直接断言 dump 的结果。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189