python - 基于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')
解决方案
你可以使用这个方法。例子:
articles = session.query(Article).filter(Article.country_tags.overlap(user.followed_countries)).all()
推荐阅读
- node.js - 有没有办法检查是否刚刚使用 Okta 身份验证 API 创建了新帐户?
- c++ - SDL_GAMECONTROLLERCONFIG 与 SDL_GameControllerAddMappingsFromFile
- java - 仅使用本地锁从 BST 中进行多线程删除
- javascript - 为什么 web worker 版本运行时间更长?
- excel - 刷新数据链接到 MS Access 查询时,需要允许 Excel 中的列顺序(字母顺序)更改
- html - 使用类或id都不会影响这个div的特性
- gerrit - 如何在 Gerrit 中为给定的补丁集添加描述?
- go - 不安全的从字节切片到结构的类型转换
- vim - Vim 持续冻结有几个原因
- java - 两个按键快速交替时如何避免按键绑定延迟