2012-09-18 24 views
1

我有我需要從我的數據模型,但我不知道我需要做什麼呢。我需要一些意見來幫助我思考。sqlalchemy/sql:跨模型的關係,從'堂兄'模型獲取信息

首先是一般情況。我有四個模型A,B,C,D。其餘的A有一對多關係(A可以有任意數量的B,C,D)。 B,C,D每個成功都有一對多(B可以有任意數量的C等)。這允許構建各種層次結構, G。 A實例可以具有任意數量的B,每個B具有任何數量的C,每個具有任意數量的D或A實例可以僅由任意數量的D元素構建,並且不包括中間的B或C.

使用具體術語I有調查,可以有部分,領域和元素。一項調查可能由各個領域的部分構成,每個領域都有許多要素,或者簡單地說是一系列要素的調查或者要素領域的調查。

所以,我的主要問題是關於如何爲A列表D當有任何數量的介入B或C.如何通過介入模型進行訪問?即使關係不是直接的,我也需要獲得D元素。 A.Bs.Cs.Ds在sqlalchemy中默認情況下不是一個有效的東西(我可以確定),所以我需要設置'某些'來做到這一點,但我不知道這個'東西'是什麼。

編輯:

我可以做一個列表理解

[x.Ds for x in A.Cs] 

其中工程作爲開始,但通過個案。無論干預的關係如何,我都希望將它設置爲在A上返回Ds。

而且我在每個模型中都建立了一個方法,可以在需要時將D元素傳遞給A,所以我現在已經解決了它,但不是最佳解決方案。

回答

1

不是通過python關聯獲取Ds對象,而是要求SQLAlchemy爲這些對象查詢數據庫。

如果在D模型(對C,B和A)中有3個外鍵 - 這就是我從你的帖子推斷的結果 - ,那麼你可以使用連接獲得與A相關的D對象:

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

與字段和元素的調查
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:用部分,字段和元素的調查

Ds的

Ds的只有元素的調查:

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

在這些查詢,a_idb_idc_id是鏈模型一起外鍵的名稱。而some_a_id只是您感興趣的調查的ID。

如果你想知道的獨立是否有中間模型或不是所有 DS,你可以在三個列表添加在一起:

所有Ds的

ds = ds1 + ds2 + ds3