2014-02-13 73 views
0

我已經使用flask docs中描述的樣式聲明瞭我的模型以建立一對多關係。模型嵌套兩次 - 我有條款與項目的段。SQLAlchemy - 篩選一對多關係中的子項

段和項目都具有可見性屬性,可以是True或False。編輯時,我只選擇所有項目,但在顯示時我只想選擇可見性屬性爲True的項目。

在SQLAlchemy中是否有過濾兒童的習語?我試過用子查詢,但無法達到我想要的。

例如,我想實現:

A single article -> Visible Segment 1 -> This segment's Visible Item 1 
             -> This segment's Visible Item 2 
       -> Visible Segment 2 -> This segment's Visible Item 1 
             -> This segment's Visible Item 2 
+0

您能否發佈示例代碼?我很肯定有某種_idiom_做你想做的事 –

+1

你試過做'query.filter_by(visible = True)'嗎?如果可行,你還應該爲表格中的'visible'列定義索引。 – Miguel

+0

頂級文章班級沒有可見的屬性,只有子女 – minikomi

回答

2

如果關係是指物體的小數目通常我只是這樣做在Python:

class Article(Base): 
    # ... 

    segments = relationship(Segment) 

    @property 
    def visible_items(self): 
     return [item for segment in self.segments 
        for item in segment.items 
        if segment.visible and item.visible] 

class Segment(Base): 
    # ... 

    items = relationship(Item) 

現在,如果你真的想去這個充滿關係,你可以定義與該主連接的備用關係:

class Article(Base): 
    # ... 

    segments = relationship(Segment) 

    visible_segments = relationship(Segment, 
      primaryjoin="and_(Segment.article_id == Article.id, Segment.visible == True)") 

    @property 
    def visible_items(self): 
     return [item for segment in self.visible_segments 
        for item in segment.visible_items] 

class Segment(Base): 
    # ... 

    items = relationship(Item) 
    visible_items = relationship(Item, 
       primaryjoin="and_(Item.segment_id == Segment.id, Item.visible==True)") 
+0

謝謝,我剛剛結束了篩選結果。 – minikomi

相關問題