首页 > 解决方案 > 在sqlalchemy中过滤连接表时如何仅访问过滤的对象

问题描述

我第一次使用 sqlalchemy,在读取查询结果时出现意外行为。

假设这些是我的数据库模型:

class Parent(Base):
    __table__ = "parents"
    id = Column(Integer, primary_key=True)
    children = relationship("Child", back_populates="parent")

class Child(Base):
    __table__ = "children"
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey("parents.id"))
    did_homework = Column(Boolean, default=False)
    parent = relationship("Parent", back_populates="children")

当我这样查询数据库时:

parents = session.query(Parent).join(Parent.children).filter(Child.did_homework == True).all()
good_children = parents[0].children

我希望所有人good_childrendid_homework设置为True.

但似乎查询返回了所有至少有一个 Childdid_homework设置为的父母,True然后当我访问时,parents[0].children我得到了所有children这些parent,而不仅仅是满足我标准的那些。

我试过这样查询:

result = (
        db.query(Parent, Child)
        .filter(Parent.id == Child.parent_id)
        .filter(Child.did_homework == True)
        .all()
    )

这给出了预期的元组result(元组中的每个Child都有did_homework == True),但元组Parent中的每个仍然有 all children,而不仅仅是那些完成作业的元组。

问题:有没有一种方法可以编写一个查询,只分配children那些没有被过滤掉的parent他们所属的?所以当我写:good_children = parents[0].children我可以确定所有对象good_childrendid_homework设置为True.

标签: pythonsqlalchemy

解决方案


发布此内容后,我在这里发现了同样的问题,但答案对我不起作用,但经过一些小的修改,我设法做到了:

parents = (
        db.query(Parent)
        .join(Child)
        .filter(Child.did_homework == True)
        .options(contains_eager("children"))
        .all()
    )

推荐阅读