1

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

首先是一般情况。我有四个模型 A、B、C、D。A 与其余模型之间存在一对多关系(A 可以有任意数量的 B、C、D)。B、C、D 每一个后继都有一个一对多(B 可以有任意数量的 C,等等)。这允许构建各种层次结构,例如,A 实例可以有任意数量的 B,每个 B 和任意数量的 C,每个 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,所以我现在已经解决了它,但不是最佳解决方案。

4

1 回答 1

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 与是否有中间模型无关,您可以将三个列表附加在一起:

所有 D

ds = ds1 + ds2 + ds3
于 2012-09-19T12:28:46.070 回答