python - 在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_children
都did_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_children
都did_homework
设置为True
.
解决方案
发布此内容后,我在这里发现了同样的问题,但答案对我不起作用,但经过一些小的修改,我设法做到了:
parents = (
db.query(Parent)
.join(Child)
.filter(Child.did_homework == True)
.options(contains_eager("children"))
.all()
)
推荐阅读
- angular - 如何在 valueChanges 订阅中执行 combineLatest 运算符
- c# - 尝试模拟时,源 IQueryable 未实现 IDbAsyncEnumerable
- c# - Owin context.Response.Body 始终为空
- hashicorp-vault - 无法从 Vault 中解封数据
- javascript - 在反应中访问 this.state 中的值
- javascript - Javascript 传播与继承
- php - 如何在 cakephp 3.6 中从一个表中选择所有记录和从另一个表中选择一些记录
- angular - 在Angular中使用选择时如何仅显示产品活动= 0
- laravel - 如何更改网站的基本 URL - Laravel 5.4
- python - 根据另一个 DataFrame 选择一个 DataFrame 的列