sqlalchemy,使用反向包含(not in)子列值的列表进行选择

12 浏览
0 Comments

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实现这一点?

0