我的数据模型中有我需要的东西,但我不确定我还需要做什么。我需要一些意见来帮助我思考这个问题。
首先是一般情况。我有四个模型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,所以我现在已经解决了它,但不是最佳解决方案。
答案 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_id
,b_id
和c_id
是将模型链接在一起的外键的名称。 some_a_id
只是您感兴趣的调查的ID。
如果您想知道A的所有 D,而不管是否存在介入模型,您只需将这三个列表附加在一起:
所有Ds
ds = ds1 + ds2 + ds3