我正在尝试执行此查询
subsidiaries = self.con.query(Subsidiary)\
.options(joinedload(Subsidiary.commerce)\
.joinedload(Commerce.commerce_tags))\
.filter(CommerceTag.tag_id == id)
但是不行,所以解释一下:
表之间的关系是:
我只想获得所有具有特定标签的商业的所有子公司,我想用 Subsidiary 有基类来做(我知道如果我使用 Commerce 会更容易),原因是因为我将其转换为具有以下格式的 json 值:
"subsidiaries": [
{
"id": 1,
"name": "some_name",
"commerce": {
"id": 1,
"name": "Commerce Name"
}
}
]
好吧,我可以使用 Commerce 的基类进行查询,但我认为可能迭代 commerces 以获取子公司比在查询中这样做更昂贵。
我不想加载 CommerceTag,但我在 joinedload 中加载了它,因为它不适用于 Join 方法。
我需要一些帮助才能做到这一点:(
最佳答案
这样试试:
subsidiaries = session.query(Subsidiary)\
.join(Subsidiary.commerce)\
.join(Commerce.commerce_tags)\
.filter(CommerceTag.id == id)
您的语句生成如下查询:
SELECT subsidiary.id AS subsidiary_id, subsidiary....
FROM tag, subsidiary
LEFT OUTER JOIN commerce AS commerce_1
ON subsidiary.id = commerce_1.subsidiary_id
LEFT OUTER JOIN (
tags_by_commerce AS tags_by_commerce_1
JOIN tag AS tag_1 ON tag_1.id = tags_by_commerce_1.id_tag
) ON commerce_1.id = tags_by_commerce_1.id_commerce
WHERE tag.id = :id_1
所以标签过滤没有效果。
我提议的声明生成了这个:
SELECT subsidiary.id AS subsidiary_id, subsidiary.name AS subsidiary_name
FROM subsidiary
JOIN commerce ON subsidiary.id = commerce.subsidiary_id
JOIN tags_by_commerce AS tags_by_commerce_1 ON commerce.id = tags_by_commerce_1.id_commerce
JOIN tag ON tag.id = tags_by_commerce_1.id_tag
WHERE tag.id = :id_1
关于python - 尝试通过中间表进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35447296/