SQLAlchemy/SQL:过滤table,然后加入查询

SQLAlchemy/SQL: Filter table, then join to query

我需要在加入之前过滤掉一些结果。我有三个模型:ModelA、ModelB 和 ModelC。 ModelA 和 ModelB 都与 ModelC 有关系,它们都有一个 organization_id,总是需要过滤掉。 ModelB 没有 organization_id(数据在所有组织之间共享)。

我需要将 ModelB 加入到已包含 ModelA 的查询中。联接应仅包含 ModelA.organization_id == ModelB.organization_id、ModelB.model_c_id == ModelA.model_c_id 且 ModelB 未过期的项目。

我的计划是通过到期和 organization_id 过滤 ModelB,然后使用子查询 () 将过滤后的结果加入主查询。

我有以下 Python 代码:

        query = ModelA.query().filter_by(ModelA.organization_id == organization_id)  # simplified for this post
        sub = ModelB.objects.query()
        sub = sub.filter(
            ModelB.organization_id == organization_id
        )
        sub = ModelB.subquery()
        query = query.join(
            sub, sub.columns.model_c_id == ModelA.model_c_id
        )

这是调试器的结果 SQL(没有大部分 AS 语句):

    SELECT *
    FROM parcels JOIN recipients ON recipients.id = parcels.recipient_id JOIN senders ON senders.id = parcels.sender_id
    JOIN (SELECT *
      FROM recipient_watch_lists 
      WHERE recipient_watch_lists.organization_id = %(organization_id_1)s)
    WHERE recipient_watch_lists.organization_id = %(organization_id_1)s) AS anon_1 ON anon_1.recipient_id = parcels.recipient_id 

这大概就是我想要的。当我注释掉这段代码时,所有其他代码都经过了良好的测试并且可以正常工作,所以问题似乎出在上面的代码上。有什么想法可能是错误的吗?

可能是 sub = ModelB.subquery() 的问题。该代码导致错误,但在逻辑上也是错误的,因为它取消了 org_id.

的约束

我用 sub = sub.subquery() 替换了它,代码对我有用:

query = ModelA.query.filter(ModelA.org_id == 2)
sub = ModelB.query.filter(ModelB.org_id == 2)
sub = sub.subquery()
query = query.join(sub, sub.columns.id_C == ModelA.id_C)

我也收到了 ModelB.objects 的错误,因此我将您的两行代码合二为一。 “2”是请求的示例 org_id.