当我在响应中不使用列表时,为什么会抛出错误?

2024-04-25 17:46:56 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我正在构建一个fastAPI应用程序,我希望我的响应模型从数据库中获取数据(共6列),并在API中的响应描述中返回数据

@router.post("/run/new", response_model=schemas.xyzRun)
def new_request(*,
                          db: Session = Depends(get_db),
                          request: schemas.Request):

    id = service.initiate_new(db, request)
    return db.query(models.xyzRun).filter(models.xyzRun.xyzRunid == id).all()

我只是从service.initiate_new获取id的值,然后从db返回具有该id的行。 当我放置response_model=List[schemas.xyzRun]时,它可以工作,但是上面的代码(没有列表)抛出了一个错误: pydantic.error\u wrappers.ValidationError:EtlRun的5个验证错误

我迷路了,有人能解释一下吗

其他信息: models.xyzRun是一个类xyzRun,其中我给出了__tablename____table_args__xyzRunid = Column ('xyzRunid, Integer )以及其他5个变量

schemas.xyzRun是一个类xyzRun,其中我给出了xyzRunid=int和5个其他变量


2条回答

这很简单,您的数据库会找到多个结果,并且它位于一个列表中,让我们假设您有这样一个模型

class MyModel(BaseModel):
    name: str 
    value: str 

您有一个包含两列的数据库

Name | Value
      
foo  | 1
bar  | 2
john | 3
jane | 4

当您向数据库发送请求时,如果发现多个结果

响应如下所示:

[{"name": "foo", "value": 1}, {"name": "bar", "value", 2}, ...]

Pydantic试图验证这一点,但它找到了一个List而不是一个Dict进行验证,但当您告诉它是一个列表时,它会检查该列表中的每个项目。这就是它成功返回带有List的响应的原因

出现错误是因为使用filter().all()返回一个列表而不是Dict,即它返回一组记录而不是一条记录

db.query(models.xyzRun).filter(models.xyzRun.xyzRunid == id).all()

要获取单个记录,应使用

db.query(models.xyzRun).filter(models.xyzRun.xyzRunid == id).first()

如果您总是希望有一条记录,那么也可以使用.one()而不是.first()

请查看https://docs.sqlalchemy.org/en/13/orm/tutorial.html#returning-lists-and-scalars了解更多参考资料

相关问题 更多 >