Python sqlalchemy,使用子列值的反向包含(不在)列表选择

Python sqlalchemy,使用子列值的反向包含(不在)列表选择,python,sqlalchemy,flask-sqlalchemy,Python,Sqlalchemy,Flask Sqlalchemy,在flask sqlalchemy中,我有一个典型的Post/Tags(与一个Post关联的许多标记)关系,我想选择在我提供的列表中没有任何标记的Post。首先,我建立的模型: 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

在flask sqlalchemy中,我有一个典型的Post/Tags(与一个Post关联的许多标记)关系,我想选择在我提供的列表中没有任何标记的Post。首先,我建立的模型:

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',this'])

失败于

AttributeError:与Post.tags关联的“InstrumentedAttribute”对象和“Comparator”对象都没有属性“name”

我认为这是因为标记是一种关系,而不是一列。当我在手动编写实际的SQL时,我在另一个项目中进行了这项工作。这就是有效的SQL:

SELECT*FROM$posts WHERE id NOT IN(从$tags WHERE name IN('dont'、'want'、'this')中选择post\u id)

如何使用sqlalchemy API实现这一点?

试试这个,简单:

users = session.query(Post).filter(not_(Post.tags.name.in_(['dont', 'want', these'])))

希望这有帮助

我想出了一个令人讨厌的解决办法,但它暂时有效。我很想知道是否有人想出了更聪明的方法

ignore_ids = [item.post_id for item in Tag.query.filter(Tag.name.in_(['dont','want','these'])).all()]
Post.query.filter(Post.id.notin_(ignore_ids))

使用negated非常简单:

我的作品,调整后的示例

db.session.query(Post).filter(Post.tags.notin_(['dont','want','these'])) 

嗯,我得到的错误与我原来的帖子中详述的相同。它说Post.tags没有“name”属性。先生,你是救命恩人!
db.session.query(Post).filter(Post.tags.notin_(['dont','want','these']))