我有一对具有基本父/子关系的模型。孩子有一个字段foo
。我想创建一个SQLAlchemy查询,该查询将返回所有具有foo匹配条件的子对象的Parent对象。与那些父母一起,我想要归还孩子,但前提是他们符合过滤标准。
这些是我的模特:
class Parent(Model):
__tablename__ = 'parent'
id = Column(Integer, primary_key=True)
children = relationship('Child', backref='parent')
class Child(Model):
__tablename__ = 'child'
id = Column(Integer, primary_key=True)
foo = Column(String(128))
parent_id = Column(Integer, ForeignKey('parent.id'), nullable=False)
这是一个例子。假设我有父母A
和B
。我有孩子a1
,a2
,b1
和b2
。子a1
有foo = 1
,a2.foo = 2
,等等。
我想创建一个类似“child.foo == 1”的查询,并获取此数据:
[
{
id: 'A',
children: ['a1'],
},
{
id: 'B',
children: ['b1'],
}
]
请注意,结果中不包含a2
和b2
。
到目前为止我已经考虑了两个想法,但还没有解决:
选择子项,然后构建父对象。
当我这样做时,我无法查询父级的字段,这也是必需的。
选择父母,然后遍历匹配的父母并进行更多查询以收集匹配的孩子。
这(似乎)要求O(n)查询,我不想这样做。
答案 0 :(得分:1)
要从单个查询中获得所需内容,您需要使用join()
和contains_eager()
:
q = session.query(Parent).\
join(Parent.children).\
options(contains_eager(Parent.children)).\
filter(Child.foo == 1)