0

我有一对具有基本父/子关系的模型。孩子有一个领域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和。孩子有, , 等等。b1b2a1foo = 1a2.foo = 2

我想做一个像“child.foo == 1”这样的查询,并取回这些数据:

[
    {
        id: 'A',
        children: ['a1'],
    },
    {
        id: 'B',
        children: ['b1'],
    }
]

请注意a2b2不包含在结果中。

到目前为止我已经考虑过两个想法,但还没有解决:

  1. 选择子对象,然后构建父对象。

    执行此操作时,我无法查询父项上的字段,这也是必需的。

  2. 选择父母,然后遍历匹配的父母并进行更多查询以收集匹配的孩子。

    这(似乎)需要 O(n) 查询,我不想这样做。

4

1 回答 1

1

要从单个查询中获得所需的一切,您需要使用join()and contains_eager()

q = session.query(Parent).\
    join(Parent.children).\
    options(contains_eager(Parent.children)).\
    filter(Child.foo == 1)
于 2013-09-01T10:29:04.857 回答