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 的结果。这类问题最好一次改到位,反复小改反而容易把原因搅混。
