sqlalchemy / sql:交叉模型关系,从'堂兄'模型中获取信息

时间:2012-09-18 12:52:37

标签: python sql orm sqlalchemy datamodel

我的数据模型中有我需要的东西,但我不确定我还需要做什么。我需要一些意见来帮助我思考这个问题。

首先是一般情况。我有四个模型A,B,C,D。其余的A有一对多的关系(A可以有任意数量的B,C,D)。 B,C,D每次成功都有一对多(B可以有任意数量的C等)。这允许构建各种层次结构,例如, G。一个实例可以有任意数量的B,每个都有任意数量的C,每个都有任意数量的D或A实例可以只由任意数量的D元素构成,而且没有中间的B或C.

使用具体术语我有可以有部分,字段和元素的调查。调查可能是由具有各自字段的部分构成的,每个字段都有许多元素,或者仅仅是一组元素的调查或带有元素字段的调查。

所以,我的主要问题是如果有任何数量的干预B或C,如何获得A的列表D.如何通过干预模型进行访问?即使关系不直接,我也需要得到D元素。默认情况下,A.Bs.Cs.Ds在sqlalchemy中不是一个有效的东西(我可以确定),所以我需要设置'某事'才能做到这一点,但我不知道这个'某事'是什么

编辑:

我可以做一个列表理解

[x.Ds for x in A.Cs]

作为一个开始,但具体情况。无论干预关系如何,我都想把它设置为A上的Ds。

我在每个模型中构建了一个方法,我可以在需要时将D元素传递给A,所以我现在已经解决了它,但不是最佳解决方案。

1 个答案:

答案 0 :(得分:1)

不是通过python关联获取Ds对象,而是要求SQLAlchemy在数据库中查询这些对象。

如果你在D模型中有3个外键(到C,B和A) - 这是我从你的帖子推断的 - 那么你可以使用连接获得与A相关的D个对象:

包含部分,字段和元素的调查的Ds

ds1 = session.query(D).join(C, D.c_id == C.id).join(B, C.b_id == B.id).join(A, B.a_id == A.id).filter(A.id = some_a_id).all()

包含字段和元素的调查的Ds

ds2 = session.query(D).join(C, D.c_id == C.id).join(A, C.a_id == A.id).filter(A.id = some_a_id).all()

仅包含元素的调查的Ds

ds3 = session.query(D).join(A).filter(A.id = some_a_id).all()

在这些查询中,a_idb_idc_id是将模型链接在一起的外键的名称。 some_a_id只是您感兴趣的调查的ID。

如果您想知道A的所有 D,而不管是否存在介入模型,您只需将这三个列表附加在一起:

所有Ds

ds = ds1 + ds2 + ds3