0

基本的な親子関係を持つモデルのペアがあります。子にはフィールドがありますfoo。条件に一致する foo を持つ子を持つすべての親オブジェクトを返す SQLAlchemy クエリを作成したいと考えています。これらの親と一緒に、フィルター基準に一致した場合にのみ、子供を返したいと思います。

これらは私のモデルです:

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しましょうBa1私には、a2b1、および の子供がいb2ます。子a1foo = 1a2.foo = 2などを持っています。

「child.foo == 1」のようなクエリを作成して、このデータを取得したい:

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

a2b2は結果に含まれないことに注意してください。

これまでに検討したものの、うまくいかなかった 2 つのアイデア:

  1. 子を選択してから、親オブジェクトを構築します。

    これを行ったときに、親のフィールドを照会できませんでした。これも必要です。

  2. 親を選択してから、一致する親を繰り返し処理し、さらにクエリを実行して一致する子を収集します。

    これには、O(n) クエリが必要なように見えますが、これはやりたくありません。

4

1 に答える 1

1

単一のクエリから必要なものをすべて取得するには、 and を使用する必要がありjoin()ますcontains_eager()

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