SQLALchemy邻接列表获取所有父母

时间:2013-05-21 11:18:51

标签: sqlalchemy flask-sqlalchemy

这是一个邻接列表示例:

class TreeNode(Base):
    __tablename__ = 'tree'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey(id))
    name = Column(String(50), nullable=False)

    children = relationship("TreeNode",
                        cascade="all",
                        backref=backref("parent", remote_side=id)
                    )

假设我有一个简单的线性结构: (0)---->(1)---->(2)---->(3)

如何获取某个节点的所有祖先节点?类似于node2.parents.all()的东西,它返回节点0和1的列表。

我试着这样做:

parents = relationship("TreeNode", cascade="all", primaryjoin="TreeNode.parent_id==TreeNode.id")

没有运气 - 它会让孩子而不是父母回归。

感谢。

2 个答案:

答案 0 :(得分:1)

你不能用简单的关系来做。 如果您使用MSSQL或Postgresql,请尝试创建一个(Hybrid)属性,该属性将利用Query.cte

答案 1 :(得分:1)

谢谢,我会查一查 - 现在看起来有点暗。如果其他人偶然发现了这一点,那么就可以使用更为彻底的东西,这仍然可以达到我的目的:

@property
def parents(self):
    allparents = []
    p = self.parent
    while p:
        allparents.append(p)
        p = p.parent
    return allparents