如何创建可接受空JSON字典的Pydantic动态模型?
解决FastAPI中接受任意结构JSON的Pydantic模型问题
你之前的写法给动态模型添加了random_data必填字段,所以请求体必须包裹在该键下。要让模型直接接受任意结构(包括空JSON字典{}),可以用以下两种方案:
方案1:使用Pydantic RootModel(推荐,适用于Pydantic v2+)
RootModel专门用于处理根级别的非嵌套结构,直接将整个请求体解析为指定类型:
from pydantic import RootModel from fastapi import FastAPI app = FastAPI() # 定义接受任意字典(含空字典)的模型 DynamicModel = RootModel[dict] @app.post("/submit") async def submit(data: DynamicModel): return {"received_data": data.root}
发送{}或任意结构的JSON对象都能被正确接收。如果需要支持所有JSON类型(如数组、字符串等),可以把dict换成Any:
from typing import Any DynamicModel = RootModel[Any]
方案2:使用__root__字段(兼容Pydantic v1/v2)
通过定义__root__字段,让模型直接将请求体映射为该字段的值:
方式A:静态定义模型
from pydantic import BaseModel, Field from fastapi import FastAPI app = FastAPI() class DynamicModel(BaseModel): __root__: dict = Field(..., description="任意结构的JSON数据") @app.post("/submit") async def submit(data: DynamicModel): return {"received_data": data.__root__}
方式B:动态创建模型
如果需要动态生成模型,修改create_model的参数,指定__root__字段即可:
from pydantic.main import create_model from fastapi import FastAPI app = FastAPI() DynamicModel = create_model( 'RandomData', __root__=(dict, ...) ) @app.post("/submit") async def submit(data: DynamicModel): return {"received_data": data.__root__}
内容的提问来源于stack exchange,提问作者cp-stack
相关产品推荐
相关产品推荐

