python - 我如何在 pydantic 模型中进行关键动态

标签 python fastapi pydantic

我有一个 api 入口点:

@app.get('/dealers_get_users/', response_model = schemas.SellSideUserId, status_code=200)
def getdata(db: database.SessionLocal = _Depends(database.get_db)):
    result = {}
    i =  db.query(models.sellSideUser).all()
    for dealer_users in i:
        result[str(dealer_users.user_id)] = {
            'user_name'  :     dealer_users.user_name,
            'user_pass'  :     dealer_users.user_pass,
            }
    m = schemas.SellSideUserId(user_id=result)
    return m

从 db 进来的数据只有 3 个字段:user_id,user_name,user_pass

当我调用 api 时,我得到了这个:

{
"user_id": {
            "1": {
                  "user_name": "testname",
                  "user_pass": "testpass"
                  }
            }
}

好的,很酷 - 我得到了我的数据。但我仍在尝试了解这些模型的工作原理,并没有真正掌握如何移入或移出嵌套字典。

例如,我希望它看起来像这样:

{
            "1": {
                  "user_name": "testname",
                  "user_pass": "testpass"
                  }
}

但我不确定如何将“结果”变量传递给此类 - 无论如何,我都会遇到错误。

我的模型:

class SellSideUserId(_BaseModel):
    user_id     : dict
    class Config:
        orm_mode = True

我是否应该构建两个 pydantic 模型 - 一个基于另一个?可以在这方面使用一些帮助

谢谢!

最佳答案

您可以使用 dict 作为 custom root type 轻松制作具有动态键的模型:

class User(BaseModel):
    name: str
    password: str

class ProductModel(BaseModel):
    __root__: Dict[str, User]

此外,您可以使用 constr 来限制字典键。功能,例如正则表达式模式:

UserId = constr(regex=r'^\d+$')

class ProductModel(BaseModel):
    __root__: Dict[UserId, User]

这适用于根据您的模型验证返回的响应。但是生成的 OpenAPI 模式会相当少,因为目前 FastAPI 0.68 和 swagger UI 还不支持 OpenAPI 3.1,其中包含诸如 patternProperties 这样的关键字或 propertyNames

关于python - 我如何在 pydantic 模型中进行关键动态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69261606/

相关文章:

python - 使用 Pydantic 将每个字段设为可选

python - 是否可以更改 fastAPI 中的 pydantic 错误消息?

python - 保存文件并重命名旧版本

python - 在 Pyspark SQL 中,您需要在哪里使用 lit()?

python - 如何使用另一个 swagger 文档扩展 FastAPI 文档?

python - 依次等待多个异步函数

python - 使用 Pydantic 嵌套模型从 FastAPI 获取 JSON

python - Django View 可以委托(delegate)给返回响应对象的函数吗?

python - 如何在 IPython (Jupyter) Notebook 中的远程机器上添加内核?

rest - 计算 API 服务中 API 调用的有效方法