我正在使用FastAPI、Pydantic和SQLAlchemy开发一个应用程序。
我希望返回与Pydantic方案匹配的数据,如
class UserResponseBody(BaseModel):
name: str
age: int
数据库模型如下所示
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, index=True)
name = Column(String, index=True)
age = Column(Integer)
当我在CRUD中查询用户时,记录还包含primary_key id
,我不想将其公开给用户。
到目前为止,我将查询结果转换为dict并弹出主键,如下所示
# https://stackoverflow.com/a/37350445/7919597
def object_as_dict(obj):
return {c.key: getattr(obj, c.key)
for c in inspect(obj).mapper.column_attrs}
query_result = db.query(models.User).first()
query_result_dict = object_as_dict(obj)
query_result_dict.pop("id", None)
return UserResponseBody(**query_result_dict)
但这感觉有点古怪,我想问一下,是否有人知道更好的解决办法。
1条答案
按热度按时间lpwwtiir1#
您已经定义了响应模型,只需要告诉FastAPI您想要使用它,并且Pydantic也应该尝试使用
.property
-表示法来解析值:只有在
response_model
中定义的字段会被包含,在您的例子中不包含id
。无需手动转换,只要您告诉FastAPI和Pydantic您想要什么,它们就会做您想要的。