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

2024-05-21 09:09:53 发布

您现在位置:Python中文网/ 问答频道 /正文

从多对多博客和标签模型开始,并从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中至少有一个标签的博客文章,并且这些标签已经被查询并返回。你知道吗

我看到的潜在问题(我在测试时遇到了问题)是,我是否想获得返回的blog上的标签列表。我想返回所有的标记,但是生成的SQL建议,这最多需要第二次查询。最坏的情况是,SQLA只返回与列表匹配的标记。你知道吗

有没有一种方法可以在ORM中提交这个查询,以便在一个数据库中返回匹配的blog文章以及它们的标签?你知道吗


Tags: oftoin标记模型列表文章tags
1条回答
网友
1楼 · 发布于 2024-05-21 09:09:53

我想出来了。不过,这感觉像是一种变通方法;必须有一种更直接的方法来使用ORM。你知道吗

基本上,使用关联表的子查询(我们称之为BlogTag,其中列blog_idtag_id分别是blogs.idtags.id的外键)来生成满足标记条件的blog_id列表。然后将blog_id列表内部联接到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()

相关问题 更多 >