我怎样才能在 pydantic 模型中制作关键动态
how can i make a key dynamic in a pydantic model
我有一个 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
从数据库传入的数据只有 3 个字段:user_id、user_name、user_pass
当我调用 api 时,我得到这个:
{
"user_id": {
"1": {
"user_name": "testname",
"user_pass": "testpass"
}
}
}
好的,太棒了 - 我得到了我的数据。但我仍在努力理解这些模型是如何工作的,并没有真正掌握如何移入或移出嵌套字典。
例如,我希望它看起来像这样,而不是:
{
"1": {
"user_name": "testname",
"user_pass": "testpass"
}
}
但我不确定如何将 'result' 变量传递给此 class - 无论我怎样做,我都会遇到错误。
我的模特:
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
сapabilities 来约束字典键,例如正则表达式模式:
UserId = constr(regex=r'^\d+$')
class ProductModel(BaseModel):
__root__: Dict[UserId, User]
这对于根据您的模型验证返回的响应非常有用。但是生成的 OpenAPI 模式将相当少,因为目前 FastAPI 0.68 和 swagger UI 还不支持 OpenAPI 3.1,其中包含 patternProperties
或 propertyNames
.[=19= 等关键字]
我有一个 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
从数据库传入的数据只有 3 个字段:user_id、user_name、user_pass
当我调用 api 时,我得到这个:
{
"user_id": {
"1": {
"user_name": "testname",
"user_pass": "testpass"
}
}
}
好的,太棒了 - 我得到了我的数据。但我仍在努力理解这些模型是如何工作的,并没有真正掌握如何移入或移出嵌套字典。
例如,我希望它看起来像这样,而不是:
{
"1": {
"user_name": "testname",
"user_pass": "testpass"
}
}
但我不确定如何将 'result' 变量传递给此 class - 无论我怎样做,我都会遇到错误。
我的模特:
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
сapabilities 来约束字典键,例如正则表达式模式:
UserId = constr(regex=r'^\d+$')
class ProductModel(BaseModel):
__root__: Dict[UserId, User]
这对于根据您的模型验证返回的响应非常有用。但是生成的 OpenAPI 模式将相当少,因为目前 FastAPI 0.68 和 swagger UI 还不支持 OpenAPI 3.1,其中包含 patternProperties
或 propertyNames
.[=19= 等关键字]