如何在FastAPI中实现支持空字典或None的Pydantic模型字段?
解决方案:将空字典自动转为None的Pydantic模型
要实现需求,你可以通过Pydantic的**前置字段验证器(field_validator,mode='before')**处理空字典的转换逻辑,在字段验证前将空字典替换为None,同时保留原有类型的验证规则。
修改后的完整代码
from fastapi import FastAPI from pydantic import BaseModel, field_validator app = FastAPI() class Wheel(BaseModel): diameter: int class Car(BaseModel): wheel: Wheel | None = None @field_validator('wheel', mode='before') def convert_empty_dict_to_none(cls, value): # 检查传入值是否为空字典,是则返回None if value == {}: return None return value @app.post("/test") async def test(car: Car): print(f"{car=}") return car
测试验证
修改后四种测试场景均符合预期:
{"car": {"wheel": {"diameter": 10}}}:正常解析,car.wheel为Wheel(diameter=10){"car": {"wheel": null}}:正常保留None{"car": {"wheel": {"foo": "bar"}}}:触发验证错误(缺少diameter字段),符合预期{"car": {"wheel": {}}}:自动转为None,返回200,car.wheel值为None
逻辑说明
mode='before'指定验证器在字段类型解析之前执行,空字典会先被转为None,后续直接匹配Wheel | None类型中的None分支,不会触发Wheel模型的字段验证- 非空字典仍会正常进入
Wheel模型的验证流程,确保数据格式合规
内容的提问来源于stack exchange,提问作者Aleksandr Shustrov
相关产品推荐
相关产品推荐

