首页 > 解决方案 > 数组中的 FastAPI 和 Pydantic AnyOf

问题描述

有没有办法像这样使用 FastAPI 在 Pydantic 中声明 AnyOf?

class RedPill(BaseModel):
    kind: str = Literal['red']
    name: str
    size: int


class BluePill(BaseModel):
    kind: str = Literal['blue']
    serialnumber: str


class Matrix(BaseModel):
    year: int
    pills: List[Union[RedPill, BluePill]] = []


@api.post('/')
def sample(data: Matrix):
    return

如何表示不同对象的有效数组。

标签: fastapipydantic

解决方案


所以你真的很接近:)你只需要将 Literal 更改为类型,它应该可以工作你可以在这里阅读有关文字的信息

from pprint import pprint
from typing import List, Union

from pydantic.main import BaseModel
from pydantic.typing import Literal


class RedPill(BaseModel):
    kind: Literal['red']
    name: str
    size: int


class BluePill(BaseModel):
    kind: Literal['blue']
    serialnumber: str


class Matrix(BaseModel):
    year: int
    pills: List[Union[RedPill, BluePill]] = []

if __name__ == "__main__":
    pprint(Matrix.parse_obj({"year": 2021, "pills": [ {"kind": "blue", "serialnumber": "123"}, {"kind": "red", "name": "foo", "size": 100} ] }).dict())
## {'pills': [{'kind': 'blue', 'serialnumber': '123'},
           {'kind': 'red', 'name': 'foo', 'size': 100}],
 'year': 2021}

推荐阅读