首页 > 解决方案 > 基于2个多对多关系的交集过滤查询的方法

问题描述

有没有办法在 sqlalchemy orm 中运行 .filter() 方法来确定一个列表中的任何项目(多对多关系)是否在另一个列表中(也是多对多)?

例如,我有以下模型和它们之间的关系:
用户模型(带有与 Country 模型多对多关系的 follow_countries 字段)
Country 模型
Article 模型(带有与 Country 模型多对多关系的 country_tags 字段)

我的问题是“有没有办法选择用户在 follow_countries 中关注的 country_tags 中有任何国家的文章?(基本上是两个列表之间的交集)”</p>

如果需要,代码片段:

country_follower_relation = db.Table(
        'country_follower',
        db.Column('user_id', db.Integer, db.ForeignKey('user.id'),
                primary_key=True),
        db.Column('country_id', db.Integer, db.ForeignKey('country.id'),
                primary_key=True))


    country_articletags_relation = db.Table(
        'country_tag',
        db.Column('article_id', db.Integer, db.ForeignKey('article.id'),
                primary_key=True),
        db.Column('country_id', db.Integer, db.ForeignKey('country.id'),
                primary_key=True))


    class User(UserMixin, db.Model):
        id = db.Column(db.Integer, primary_key=True)
        username = db.Column(db.String(64), index=True, unique=True)

        followed_countries = db.relationship(
            'Country', secondary=country_follower_relation, lazy=True,
            backref='followers')


    class Country(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(60), index=True, unique=True)


    class Article(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        body = db.Column(db.Text(100000), nullable=False)
        title = db.Column(db.String(200), nullable=False)

        country_tags = db.relationship(
            'Article', secondary=country_articletags_relation, lazy='dynamic',
            backref='articles', cascade='all')

标签: pythonsqlalchemyflask-sqlalchemy

解决方案


你可以使用这个方法。例子:

articles = session.query(Article).filter(Article.country_tags.overlap(user.followed_countries)).all()

推荐阅读