我希望在路由响应中包含一个自定义类。我的应用程序主要使用嵌套的
只要所有都继承自
pydantic.BaseModel
,因此返回整个内容而不编写从内部数据表示到路由返回的转换将是不错的选择。只要所有都继承自
pydantic.BaseModel
,这很简单,但是我在后端使用了一个无法做到这一点的Foo
类,而且我也不能为此目的子类化它。 我是否可以以某种方式鸭子类型地定义该类,以使fastapi
接受它? 目前我基本上有以下代码:
main.py
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Foo:
"""Foo holds data and can't inherit from `pydantic.BaseModel`."""
def __init__(self, x: int):
self.x = x
class Response(BaseModel):
foo: Foo
# plus some more stuff that doesn't matter right now because it works
@app.get("/", response_model=Response)
def root():
return Response(foo=Foo(1))
if __name__ == '__main__':
import uvicorn
uvicorn.run("main:app") # RuntimeError
BaseConfig.arbitrary_types_allowed = True
- 参见 fastapi issue 2382。 - michaPauFoo
实例转换为json。由于需要添加验证器才能完成此操作,因此完成后您不再需要允许任意类型,因为它已经定义明确了。 - Arnefastapi.exceptions.FastAPIError: Invalid args for response field! Hint: check that <class '__main__.Foo'> is a valid pydantic field type
。 - ArneBaseConfig.arbitrary_types_allowed = True
),服务器可以正常启动并返回foo: x: 1
(本地主机上的最小示例) - API定义也对我失败了。- 我只是评论了一下,因为我遇到了似乎谈论同样问题的问题... - michaPau