0%

FastAPI自学教程(28) - 请求体更新数据

1. 全量更新(PUT方法)

1
2
3
4
5
6
7
from fastapi.encoders import jsonable_encoder

@app.put("/items/{item_id}")
async def update_item(item_id: str, item: Item):
update_item_encoded = jsonable_encoder(item)
items[item_id] = update_item_encoded
return update_item_encoded
  • 使用HTTP PUT方法实现完整数据替换
  • 未传值的字段会被重置为模型默认值(如tax字段未传则重置为10.5)
  • 通过jsonable_encoder自动转换数据类型(如datetime转为ISO字符串)

2. 部分更新(PATCH方法)

1
2
3
4
5
6
7
8
@app.patch("/items/{item_id}")
async def update_item(item_id: str, item: Item):
stored_item_data = items[item_id]
stored_item_model = Item(**stored_item_data)
update_data = item.dict(exclude_unset=True)
updated_item = stored_item_model.copy(update=update_data)
items[item_id] = jsonable_encoder(updated_item)
return updated_item
  • 使用HTTP PATCH方法仅更新已传递的字段
  • 核心步骤:
    1. 从存储中获取原始数据并转换为Pydantic模型
    2. 使用.dict(exclude_unset=True)过滤未修改字段
    3. 通过.copy(update=...)创建包含新数据的模型副本
    4. 使用jsonable_encoder处理嵌套类型转换

3. 数据更新策略对比

方法 数据覆盖范围 默认值处理 适用场景
PUT 全量替换 未传字段使用默认值 完整资源替换场景
PATCH 部分更新 保留原有未传字段的值 局部字段更新场景

4. 嵌套模型更新注意事项

1
2
3
4
# 处理嵌套模型时需要特别注意字段合并逻辑
updated_item = stored_item_model.copy(update={
"sub_model": existing_sub_model.copy(update=new_sub_data)
})
  • 深层嵌套字段更新需逐层应用.copy(update=)方法
  • 字典类型字段更新会完全替换原有键值对(非合并)
  • 建议对复杂结构实现自定义合并逻辑

5. 生产环境最佳实践

  • 使用response_model确保响应数据结构一致
  • 对敏感字段添加额外验证逻辑(如密码哈希处理)
  • 数据库操作推荐使用异步ORM(如SQLAlchemy 2.0+)
  • 通过exclude_unset=True避免覆盖未修改字段