Dmi*_*hov 9 python sqlalchemy pydantic fastapi
我使用 Fast API 创建 Web 服务。
有以下 sqlAlchemy 模型:
class User(Base):
__tablename__ = 'user'
account_name = Column(String, primary_key=True, index=True, unique=True)
email = Column(String, unique=True, index=True, nullable=False)
roles = relationship("UserRole", back_populates="users", lazy=False, uselist=True)
class UserRole(Base):
__tablename__ = 'user_role'
__table_args__ = (UniqueConstraint('role_name', 'user_name', name='user_role_uc'),)
role_name = Column(String, ForeignKey('role.name'), primary_key=True)
user_name = Column(String, ForeignKey('user.account_name'), primary_key=True)
users = relationship("User", back_populates="roles")
Run Code Online (Sandbox Code Playgroud)
Pydantic 架构如下:
class UserRole(BaseModel):
role_name: str
class Config:
orm_mode = True
class UserBase(BaseModel):
account_name: str
email: EmailStr
roles: List[UserRole] = []
class Config:
orm_mode = True
Run Code Online (Sandbox Code Playgroud)
我现在拥有的是:
{
"account_name": "Test.Test",
"email": "Test.Test@test.com",
"roles": [
{
"role_name": "all:admin"
},
{
"role_name": "all:read"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我想要实现的是通过以下结构从 api 获取用户:
{
"account_name": "Test.Test",
"email": "Test.Test@test.com",
"roles": [
"all:admin",
"all:read"
]
}
Run Code Online (Sandbox Code Playgroud)
那可能吗?我应该如何更改模式才能得到这个?
如果您可以通过修改 fastapi 路径定义来处理如何“从 api 获取用户”问题陈述,请参见下文。
您可以更改 fastapi 路径定义使用的响应模型以处理所需的输出格式吗?
pydantic 响应模型定义示例:
class UserResponse(BaseModel):
account_name: str
email: EmailStr
roles: List[str]
Run Code Online (Sandbox Code Playgroud)
sqlalchemy 查询+序列化函数示例:
def get_user_response(user_id) -> UserResponse:
user = User.query.get(user_id)
user_roles = UserRole.query.filter(user=user_id).all()
role_names = [r.role_name for r in user_roles]
response = UserResponse(
account_name=user.account_name,
email=user.email,
roles=role_names
}
return response
Run Code Online (Sandbox Code Playgroud)
fastapi 路径定义示例:
@app.get("/users/{user_id}", response_model=UserResponse)
async def read_item(user_id):
return get_user_response(user_id)
Run Code Online (Sandbox Code Playgroud)
注意事项:
user_id
用于用户查询,但这可以替换为您最终用作该表的主键的任何内容。UserResponse
模型非常类似于UserBase
(您可以潜在地子类化UserBase
而不是 model 以避免重新定义
account_name
和email
,但必须重写类' Config
)。UserBase
sqlalchemy 模型对象的序列化格式,当您从数据库查询模型时,该对象会自动序列化,并允许您消除或减少get_user_response()
上面示例定义中函数中的代码。 归档时间: |
|
查看次数: |
15569 次 |
最近记录: |