我有一对具有基本父子关系的模型。这个孩子有田野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)查询,而我不想这样做。
要从单个查询中获取所有所需内容,您需要使用join()
和contains_eager()
:
q = session.query(Parent).\
join(Parent.children).\
options(contains_eager(Parent.children)).\
filter(Child.foo == 1)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句