2013-09-01 33 views
0

我有一對模型,有一個基本的父母/子女關係。該孩子有一個字段foo。我想創建一個SQLAlchemy查詢,該查詢將返回具有符合條件的foo子項的所有父對象。與那些父母一起,我想要歸還孩子,但只有當他們符合過濾標準。如何在O(1)查詢中篩選父母和子女?

這是我的模型:

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) 

下面是一個例子。可以說我有父母AB。我有孩子a1,a2,b1b2。孩子a1具有foo = 1,a2.foo = 2等等。

我要讓像「child.foo == 1」的查詢,並得到這個數據傳回:

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

注意a2b2不包括在結果中。

兩個想法到目前爲止,我已經考慮,但還沒有制定出:

  1. 選擇上了孩子,然後建立父對象。

    當我這樣做時,我無法查詢父項上的字段,這也是必需的。

  2. 選擇父母,然後遍歷匹配父母並進行更多查詢以收集匹配的孩子。

    這(出現)需要O(n)查詢,我不想這樣做。

回答

1

爲了讓你從一個單一的查詢想要的,你需要使用join()contains_eager()

q = session.query(Parent).\ 
    join(Parent.children).\ 
    options(contains_eager(Parent.children)).\ 
    filter(Child.foo == 1) 
+0

啊哈!這正是我需要的,謝謝! –