fastapi的参数剖析 📅 2026/8/14 2:13:28 exclude_unset VS exclude_noneFastAPI PATCH高频坑先记住核心结论exclude_unsetTrue剔除前端没传的字段PATCH首选exclude_noneTrue剔除值为None的字段1. 概念拆解假设模型frompydanticimportBaseModelfromtypingimportOptionalclassArticleUpdate(BaseModel):title:Optional[str]Nonecontent:Optional[str]None前端请求体{title: null}① model_dump(exclude_unsetTrue)只过滤请求里没有提交的字段前端传了title: null→ 属于主动提交会保留{title: None}前端没传content→ 直接删掉输出结果{title:None}② model_dump(exclude_noneTrue)过滤所有值等于None的字段不管前端有没有传前端传{title: null}输出结果{}2. 场景对比重点原有数据库数据title旧标题, content旧内容场景APATCH 局部更新正常业务需求需求只更新前端传过来的字段不传的不动推荐exclude_unsetTrue前端传{title:新标题}→ 更新titlecontent保留原值 ✅前端传{title: null}→ 后端收到把title更新为null业务允许清空标题时使用这就是你代码里标准写法场景B如果你误用 exclude_noneTrue前端发送{title: null}想清空标题最终拿到空字典数据库标题不会被清空出现隐性bug。3. 一张表看懂区别配置规则前端传{title:null}前端不传titleexclude_unsetTrue删掉未传入字段{title: None}移除titleexclude_noneTrue删掉值为None字段{}移除title4. 终极开发规范PATCH 局部更新 → 固定用 exclude_unsetTrueupdate_dataarticle.model_dump(exclude_unsetTrue)什么时候用 exclude_none极少场景允许前端传null但你不想把null写入数据库主动忽略null字段。业务上不推荐需要清空字段就正常让它更新为null逻辑清晰。5. 拓展容易混淆的第三个参数exclude_defaultsTrue剔除等于字段默认值的数据。比如字段默认None效果近似exclude_none但触发逻辑不一样日常PATCH几乎不用。6. 经典踩坑案例很多新手写PATCH错误写法# ❌ 错误article.model_dump(exclude_noneTrue)前端想清空标题{title:null}结果更新失效找bug很久。