【发布时间】:2019-12-02 22:19:59
【问题描述】:
我需要在加入之前过滤掉一些结果。我有三个模型: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 未过期的项目。
我的计划是通过过期和组织 ID 过滤 ModelB,然后使用 subquery() 将过滤后的结果加入到主查询中。
我有以下 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
这似乎大致是我想要的。当我注释掉这段代码时,所有其他代码都经过充分测试并且工作正常,所以问题似乎出在上面的代码上。有什么想法可能是错的吗?
【问题讨论】:
标签: sql sqlalchemy python-3.7