【问题标题】:SQLAlchemy - Filtering children in One-To-Many relationshipsSQLAlchemy - 过滤一对多关系中的孩子
【发布时间】:2014-03-12 03:44:30
【问题描述】:

我已使用flask docs 中描述的样式声明我的模型具有一对多关系。模型嵌套了两次 - 我有带有分段和项目的文章。

Segments 和 Items 都有一个可见性属性,可以是 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

【问题讨论】:

  • 你能发布一个示例代码吗?我很确定有某种成语可以做你想做的事
  • 你试过query.filter_by(visible=True)吗?如果可行,您还应该为表中的visible 列定义索引。
  • 顶级文章类类没有可见的属性,只有孩子

标签: python sqlalchemy flask


【解决方案1】:

如果关系涉及少量对象,我通常只在 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)

现在,如果您真的想为此建立完整的关系,您可以定义与该 primaryjoin 的备用关系:

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)")

【讨论】:

  • 谢谢,我刚刚过滤了结果。
猜你喜欢
  • 1970-01-01
  • 2021-08-14
  • 2012-02-08
  • 1970-01-01
  • 2014-05-19
  • 2021-12-17
  • 2012-11-11
  • 1970-01-01
  • 2018-05-03
相关资源
最近更新 更多