SQLAlchemy加入一个"一对多的表"然后使用一组值过滤联接表

时间:2016-03-21 19:00:50

标签: python sqlalchemy

我有一个包含标签的条目模型,因此每个条目都可以包含许多标签。标签是一个带有tag值的模型,它是标签字符串。我试图在标签集上过滤我返回的条目。例如,给定两个标签a和b,我想只返回同时包含标签a和标签b的条目。

现在我有OR,从某种意义上说,我可以返回任何带有a或b的条目,我已经这样做了。

entObjs = Entries.query.join(Entries.tags).filter(Tags.tag.in_(tagList)).all()

tagList是一个字符串列表。如何实现AND,所以我只获得包含所有标签的条目?

1 个答案:

答案 0 :(得分:1)

我使用别名表和连接做了类似的事情,

from sqlalchemy.orm import aliased

def test(self, tags):       
    q = self.session.query(models.Item).\
             join(models.ItemTag).\
             join(models.Tag.\
             filter(models.Tag.name == tags[0])
    i = 0
    for tag in tags[1:]:
        alias1 = aliased(models.Tag)
        alias2 = aliased(models.ItemTag)
        q = q.join(alias2, models.Item.id == alias2.item_id).\
              filter(alias1.id == alias2.tag_id).\
              filter(alias1.name == tag)
        i += 1

    print(str(q))