db.load_only不过滤字段

时间:2020-03-17 11:12:10

标签: python orm sqlalchemy graphql apollo

假设我们有一个简单的graphql查询:

 query EventQuery {
    event(id: 1) {
      id
      name
      description
  }
}

我们的解决方法是这样的:

    def resolve_event(self, info, id):
        event = (Event.get_query(info).filter_by(id=id).options(db.load_only('id', 'name'))).first()
        return event

    def resolve_event(self, info, id):
        event = db.session.query(EventModel).filter_by(id=id).options(db.load_only('id', 'name')).first()
        return event

在两种情况下,解析程序都将返回ID,名称和描述,db.load_only根本不起作用。我在做什么错了?

1 个答案:

答案 0 :(得分:0)

摘自load_only文档:

指示对于特定实体,仅应加载给定的基于列的属性名称列表;所有其他人都将被推迟。

此处“延迟”表示其余列将被延迟加载;因此,在您的情况下,如果有人曾经调用event.description,则此时将发出一个单独的SQL查询,以从数据库中加载描述列。

正确的解决方案实际上取决于您在下一层处理的内容:如果您希望GraphQL查询返回可在python中使用的SQLAlchemy实体,那么当前行为可能正是您想要的-只是不要在您的代码中访问event.description。如果您要构建返回JSON或类似内容的API,则还需要告知序列化层要从event实体中提取哪些列。