基于2个多对多关系之间的交集过滤查询的方法

时间:2020-05-20 02:10:21

标签: python sqlalchemy flask-sqlalchemy

是否可以在sqlalchemy orm中运行.filter()方法以确定一个列表(多对多关系)中的任何项是否在另一个列表(多对多)中?

例如,我有以下模型及其之间的关系:
用户模型(其follow_countries字段与国家/地区模型具有多对多关系)
国家模型
文章模型(具有与“国家/地区”模型有多对多关系的country_tags字段)

我的问题是“有没有一种方法可以选择用户在followed_countries中关注的country_tags中具有任何国家/地区的文章? (基本上是2个列表之间的交集)”

代码片段(如果需要):

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')

1 个答案:

答案 0 :(得分:0)

您可以使用 this method。示例:

articles = session.query(Article).filter(Article.country_tags.overlap(user.followed_countries)).all()
相关问题