json 数组的 Pydantic 模型
Pydantic model for array of jsons
我正在使用 FastAPI 编写 Web 服务。又好又快
FastAPI 使用 pydantic 模型来验证输入和输出数据,一切都很好,但是当我想为 json 数组声明嵌套模型时,如下所示:
[
{
"name": "name1",
"family": "family1"
},
{
"name": "name2",
"family": "family2"
}
]
我得到空响应。
我认为我的模型有问题:
class Test(BaseModel):
name: str
family: str
class Config:
orm_mode = True
class Tests(BaseModel):
List[Test]
class Config:
orm_mode = True
所以,我的问题是我应该如何为 json 数组编写模型?
更新 (26/09/2020)
在 Python 3.9(尚未发布)中,您可以执行与下面 but with the built-in list
generic type(始终在范围内)相同的操作,而不需要导入大写的 List
类型来自 typing
,例如
@app.get("/tests", response_model=list[Test])
这里的问题是您试图在不需要的地方创建 pydantic 模型。如果你想 serialize/deserialize 对象列表,只需将你的单一模型包装在 python 内置 typing
模块的 List[]
中。无需尝试使用 pydantic BaseModel
创建对象的复数版本(如您所见,它无论如何都不起作用)。
话虽如此,做你想做的最简单的方法是在任何你需要 Test
列表的地方指定一个 List[Test]
,例如
from typing import List
from fastapi import FastAPI
from pydantic import BaseModel
existing_tests = [
{
"name": "name1",
"family": "family1"
},
{
"name": "name2",
"family": "family2"
}
]
class Test(BaseModel):
name: str
family: str
class Config:
orm_mode = True
app = FastAPI()
@app.get("/tests", response_model=List[Test])
async def fetch_tests():
return existing_tests
@app.post("/tests")
async def submit_tests(new_tests: List[Test]):
print(new_tests)
当然,如果您发现自己反复(或仅)将 Test
指定为列表,您当然可以将其分配给一个变量,然后在需要的地方使用该变量,如下所示:
Tests = List[Test]
@app.get("/tests", response_model=Tests)
async def fetch_tests():
return existing_tests
@app.post("/tests")
async def submit_tests(new_tests: Tests):
print(new_tests)
我认为第一个选项在您的代码中可能稍微清晰一些,除非您多次指定 List[Test]
,否则为此目的使用变量可能不值得额外的间接层。
我正在使用 FastAPI 编写 Web 服务。又好又快
FastAPI 使用 pydantic 模型来验证输入和输出数据,一切都很好,但是当我想为 json 数组声明嵌套模型时,如下所示:
[
{
"name": "name1",
"family": "family1"
},
{
"name": "name2",
"family": "family2"
}
]
我得到空响应。
我认为我的模型有问题:
class Test(BaseModel):
name: str
family: str
class Config:
orm_mode = True
class Tests(BaseModel):
List[Test]
class Config:
orm_mode = True
所以,我的问题是我应该如何为 json 数组编写模型?
更新 (26/09/2020)
在 Python 3.9(尚未发布)中,您可以执行与下面 but with the built-in list
generic type(始终在范围内)相同的操作,而不需要导入大写的 List
类型来自 typing
,例如
@app.get("/tests", response_model=list[Test])
这里的问题是您试图在不需要的地方创建 pydantic 模型。如果你想 serialize/deserialize 对象列表,只需将你的单一模型包装在 python 内置 typing
模块的 List[]
中。无需尝试使用 pydantic BaseModel
创建对象的复数版本(如您所见,它无论如何都不起作用)。
话虽如此,做你想做的最简单的方法是在任何你需要 Test
列表的地方指定一个 List[Test]
,例如
from typing import List
from fastapi import FastAPI
from pydantic import BaseModel
existing_tests = [
{
"name": "name1",
"family": "family1"
},
{
"name": "name2",
"family": "family2"
}
]
class Test(BaseModel):
name: str
family: str
class Config:
orm_mode = True
app = FastAPI()
@app.get("/tests", response_model=List[Test])
async def fetch_tests():
return existing_tests
@app.post("/tests")
async def submit_tests(new_tests: List[Test]):
print(new_tests)
当然,如果您发现自己反复(或仅)将 Test
指定为列表,您当然可以将其分配给一个变量,然后在需要的地方使用该变量,如下所示:
Tests = List[Test]
@app.get("/tests", response_model=Tests)
async def fetch_tests():
return existing_tests
@app.post("/tests")
async def submit_tests(new_tests: Tests):
print(new_tests)
我认为第一个选项在您的代码中可能稍微清晰一些,除非您多次指定 List[Test]
,否则为此目的使用变量可能不值得额外的间接层。