我有项目和标签的 m2m 关系。我希望能够创建一个动态 AND 查询,该查询将获取具有每个列出的标签的每个项目。
这是一个工作示例,但我希望它是动态的(随机数量的标签)。
return Item.query.filter(Item.item_tag.any(name = 'test'))\
.filter(Item.item_tag.any(name = 'tag'))\
.filter(Item.item_tag.any(name = 'tag1'))\
.filter(Item.item_tag.any(name = 'tag2'))\
.all()
这是 or_ 的一个工作示例:
tags = or_( *[Tag.name==x for x in tags] )
return Item.query.join(Tag.items).filter(tags).all()
我正在为 AND 寻找类似的东西。
编辑:为工作 AND 解决方案生成的 sql 是:
SELECT item.id AS item_id, item.title AS item_title, item.url AS item_url, item.body AS item_body, item.itempic AS item_itempic, item.time_published AS item_time_published, item.private AS item_private, item.user_id AS item_user_id FROM item WHERE (EXISTS (SELECT 1 FROM item_tag, tag WHERE item.id = item_tag.item_id AND tag.id = item_tag.tag_id AND tag.name = ?)) AND (EXISTS (SELECT 1 FROM item_tag, tag WHERE item.id = item_tag.item_id AND tag.id = item_tag.tag_id AND tag.name = ?))
编辑2:
我需要的示例:Item1 有标签:tag1、tag2、tag3。Item2 有标签:tag1、tag2、tag3、tag4。
搜索标签时:tag1、tag2、tag3。item1 和 item2 都被返回。搜索标签时:tag1、tag2、tag3、tag4。仅返回 item2。