我怎样才能在 pydantic 模型中做出关键的动态

avn*_*v99 4 python pydantic fastapi

我有一个 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
Run Code Online (Sandbox Code Playgroud)

从数据库传入的数据只有 3 个字段:user_id、user_name、user_pass

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

{
"user_id": {
            "1": {
                  "user_name": "testname",
                  "user_pass": "testpass"
                  }
            }
}
Run Code Online (Sandbox Code Playgroud)

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

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

{
            "1": {
                  "user_name": "testname",
                  "user_pass": "testpass"
                  }
}
Run Code Online (Sandbox Code Playgroud)

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

我的模型:

class SellSideUserId(_BaseModel):
    user_id     : dict
    class Config:
        orm_mode = True
Run Code Online (Sandbox Code Playgroud)

我是否应该构建两个 pydantic 模型 - 一个基于另一个模型?需要一些帮助

谢谢!

ale*_*ame 8

dict您可以使用自定义根类型轻松创建具有动态键的模型:

\n
class User(BaseModel):\n    name: str\n    password: str\n\nclass ProductModel(BaseModel):\n    __root__: Dict[str, User]\n
Run Code Online (Sandbox Code Playgroud)\n

此外,您可以使用constr\xd1\x81apativity 约束字典键,例如正则表达式模式:

\n
UserId = constr(regex=r\'^\\d+$\')\n\nclass ProductModel(BaseModel):\n    __root__: Dict[UserId, User]\n
Run Code Online (Sandbox Code Playgroud)\n

这对于根据您的模型验证返回的响应非常有用。但生成的 OpenAPI 模式将相当匮乏,因为目前 FastAPI 0.68 和 swagger UI 尚不支持 OpenAPI 3.1,其中包含诸如patternProperties或 之类的关键字propertyNames

\n