【问题标题】:sqlalchemy/sql : cross model relationships, getting info from 'cousin' modelssqlalchemy/sql:跨模型关系,从“表亲”模型中获取信息
【发布时间】:2012-09-10 17:48:57
【问题描述】:

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

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

【问题讨论】:

    标签: python sql orm sqlalchemy datamodel


    【解决方案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 的 所有 Ds,而不管是否有中间模型,你可以将三个列表附加在一起:

    所有 Ds

    ds = ds1 + ds2 + ds3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-17
      • 2021-07-04
      • 2018-01-19
      • 1970-01-01
      • 2018-02-18
      相关资源
      最近更新 更多