python-3.x 有没有办法从SQLAlchemy查询结果中删除主键?

lvmkulzt  于 2022-11-26  发布在  Python
关注(0)|答案(1)|浏览(145)

我正在使用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)

但这感觉有点古怪,我想问一下,是否有人知道更好的解决办法。

lpwwtiir

lpwwtiir1#

您已经定义了响应模型,只需要告诉FastAPI您想要使用它,并且Pydantic也应该尝试使用.property-表示法来解析值:

class UserResponseBody(BaseModel):
    name: str
    age: int

    class Config:
        orm_mode = True

@app.get('/users/first', response_model=UserResponseBody)
def get_first_user():
    return db.query(models.User).first()

只有在response_model中定义的字段会被包含,在您的例子中不包含id。无需手动转换,只要您告诉FastAPI和Pydantic您想要什么,它们就会做您想要的。

相关问题