1

我有项目和标签的 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。

4

2 回答 2

2

也许我错过了明显的,但是:

tags = and_( *[Tag.name==x for x in tags] )
return Item.query.join(Tag.items).filter(tags).all()

参考这个:http ://docs.sqlalchemy.org/en/rel_0_8/core/expression_api.html#sqlalchemy.sql.expression.and_

于 2013-04-10T16:54:26.967 回答
-2

我不确定您是否非常清楚地表达了您的问题。

为什么要过滤然后遍历任何标签?为什么不只使用 Item.query.all() (如果你需要一个随机集,那么使用 random 模块和 .choice() 来选择一些返回的项目)?

也许我误解了什么。从来不需要这种查询。

于 2013-04-12T19:55:22.810 回答