其他分享
首页 > 其他分享> > FastApi 当response_model=union[ModeA,ModeB]时,返回数据仅转化为ModeA形式问题

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"
}
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 

标签:__,name,union,FastApi,app,DataA,ModeA,import,id
来源: https://blog.csdn.net/sillyhome/article/details/115393355