我在使用FastAPI和Pydantic时遇到了问题。我尝试根据我的Pydantic模型返回一个记录列表。
以下是SQLAlchemy元数据:
from sqlalchemy import MetaData, Table, Column, Integer, JSON, Boolean
from sqlalchemy.sql import expression
metadata = MetaData()
CustomLayers = Table(
"custom_layers",
metadata,
Column("id", Integer, primary_key=True),
Column("data", JSON),
Column("is_public", Boolean, default=expression.false()),
Column("user_id", Integer),
)
下面是“相应的”pydantic模型:
from geojson_pydantic.features import FeatureCollection
from pydantic import BaseModel
class CustomLayerResponse(BaseModel):
is_public: bool
data: FeatureCollection
user_id: int
id: int
class Config:
orm_mode = True
这是我的路线:
@router.get("/", response_model=List[CustomLayerResponse], status_code=status.HTTP_200_OK)
async def retrieve_by_user(user_id: int):
layer_records = await customlayers_repository.retrieve_by_user_id(user_id)
return layer_records
下面是使用Databases library的检索操作(基于SQL Alchemy )
async def retrieve_by_user_id(user_id: int):
query = CustomLayersTable.select().where(user_id == CustomLayersTable.c.user_id)
return await database.fetch_all(query=query)
但是当我运行这个的时候,我得到了来自pydantic的几束ValidationError
,上面写着:
response -> 7 -> id
field required (type=value_error.missing)
response -> 7 -> user_id
field required (type=value_error.missing)
response -> 7 -> is_public
field required (type=value_error.missing)
response -> 7 -> data
field required (type=value_error.missing)
但真正奇怪的是,如果我遍历ORM返回的DB记录,并以这种方式手动创建pydantic模式的实例:
@router.get("/", response_model=List[CustomLayerResponse], status_code=status.HTTP_200_OK)
async def retrieve_by_user(user_id: int):
layer_records = await customlayers_repository.retrieve_by_user_id(user_id)
response = []
for l in layer_records:
manual_instance = CustomLayerResponse(data=FeatureCollection.parse_raw(l.get("data")),
user_id=l.get("user_id"),
id=l.get("id"),
is_public=l.get("is_public"))
response.append(manual_instance)
return response
然后,一切都像预期的那样工作,我得到了CustomLayerResponse
的列表作为响应。
所以我想知道来自pydantic模型的“自动”验证(由FastAPI提供的response_model
参数提供的验证,我在这里设置为List[CustomLayerResponse]
)会有什么问题?
发布于 2021-06-30 00:41:55
您的数据字段应该使用同时扩展FeatureCollection和BaseModel的类,以便您也可以将其Config子类字段orm_true设置为true。
我还没有用FeatureCollection it自己测试过这一点,但类似的事情发生在我身上。
https://stackoverflow.com/questions/66911760
复制相似问题