sqlalchemy,使用反向包含(not in)子列值的列表进行选择
sqlalchemy,使用反向包含(not in)子列值的列表进行选择
我在flask-sqlalchemy中有一个典型的帖子/标签(一个帖子与多个标签相关联)关系,并且我想选择没有与我提供的标签列表中的任何标签相关联的帖子。首先,我设置了以下模型:
class Post(db.Model): id = db.Column(db.Integer, primary_key=True) tags = db.relationship('Tag', lazy='dynamic') class Tag(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.Text(50)) post_id = db.Column(db.Integer, db.ForeignKey('post.id'))
类似于
db.session.query(Post).filter(Post.tags.name.notin_(['dont','want','these']))
会失败,显示
AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object associated with Post.tags has an attribute 'name'
我猜这是因为tags是一个关系而不是一个列。在我手动编写实际的SQL时,我在另一个项目上使其工作。这是有效的SQL:
SELECT * FROM $posts WHERE id NOT IN (SELECT post_id FROM $tags WHERE name IN ('dont','want','these'))
如何使用sqlalchemy API实现这一点?