SQLAlchemy:过滤多对多但返回所有结果

时间:2014-06-23 07:43:00

标签: python postgresql python-2.7 sqlalchemy

Querying a many-to-many relationship in SQLAlchemy的多对多博客和标记模型和查询开始,我知道session.query(Blog).join(Blog.tags).options(contains_eager(Blog.tags)).filter(Blog.tags.in_(list_of_relevant_tags)).all()将为我提供list_of_relevant_tags中至少包含一个标记的所有博客帖子1}},这些标签已经被查询并返回。

我看到的潜在问题(我在测试时遇到了问题)是我想在返回的博客上获取标签列表。我想返回所有标签,但生成的SQL会建议,充其量,这需要第二次查询。在最坏的情况下,SQLA将只返回与列表匹配的标记。

有没有办法在ORM中提交此查询以在一个数据库匹配中返回匹配的博客帖子以及所有他们的标签?

1 个答案:

答案 0 :(得分:0)

我想出了什么。不过,感觉就像是一种解决方法;使用ORM,这是一个更直接的方法。

基本上,您使用关联表的子查询(让我们将BlogTag称为blog_idtag_id,它们是blogs.id的外键和tags.id分别生成符合标记条件的blog_id列表。然后,您将blog_id的{​​{1}}列表内联接到Blog加入Tag的未经过滤的查询,只返回相关的Blog

t = session.query(BlogTag.blog_id).filter(BlogTag.tag_id.in_(list_of_relevant_tags)).\
    group_by(BlogTag.blog_id).subquery('t')
blogs = session.query(Blog).join(Blog.tags).join(t, t.c.blog_id == Blog.id).\
    options(contains_eager(Blog.tags)).all()