FastApi 当response_model=union[ModeA,ModeB]时,返回数据仅转化为ModeA形式问题
作者:互联网
接口需求:根据构造的返回数据字典,自动正确适配Union中的数据模型
问题引出:运行如下代码,期待输出为:当请求中的id值为1时,按照DataA模型定义的格式返回结果,当id值为2时,按照DataB模型定义的格式返回结果,
但实际结果为:当请求中的id值为1时,按照DataA模型定义的格式返回结果,当id值为2时,按照DataA模型定义的格式返回结果
import uvicorn
from fastapi import FastAPI
from pydantic import BaseModel
from typing import Union
app = FastAPI()
class DataA(BaseModel):
name: str = 'newa'
age: int = 10
class DataB(BaseModel):
user: str = 'tom'
passward: str = '0'
@app.get("/test/{id}", response_model=Union[DataA, DataB])
async def update_item(id: int):
if id == 1:
return {'name': 'da', 'age': 20}
if id == 2:
return {'user': 'alice', 'passward': '123456'}
if __name__ == '__main__':
uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)
实际运行结果为:
请求URL:http://127.0.0.1:8004/test/1,返回结果:
{
"name": "da",
"age": 20
}
请求URL:http://127.0.0.1:8004/test/2,返回结果:
{
"name": "newa",
"age": 10
}
原因分析:DataA和DataB中的所有字段均定义了默认值,所以虽然返回的是DataB形式的数据,但程序仍认为数据的类型为Union中设置的第一个数据类型DataA,故返回结果产生错误
解决方案:在DataA和DataB中设置一个区分彼此的字段,字段设置为 必填且没有默认值,具体来说,就是将上述代码改动如下:
import uvicorn
from fastapi import FastAPI
from pydantic import BaseModel
from typing import Union
app = FastAPI()
class DataA(BaseModel):
name: str #区分字段,必填且没有默认值
age: int = 10
class DataB(BaseModel):
user: str #区分字段,必填且没有默认值
passward: str = '0'
@app.get("/test/{id}", response_model=Union[DataA, DataB])
async def update_item(id: int):
if id == 1:
return {'name': 'da', 'age': 20}
if id == 2:
return {'user': 'alice', 'passward': '123456'}
if __name__ == '__main__':
uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)
再次运行后,结果如下:
请求URL:http://127.0.0.1:8004/test/1,返回结果:
{
"name": "da",
"age": 20
}
请求URL:http://127.0.0.1:8004/test/2,返回结果:
{
"user": "alice",
"passward": "123456"
}
标签:__,name,union,FastApi,app,DataA,ModeA,import,id 来源: https://blog.csdn.net/sillyhome/article/details/115393355