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

新手上路,请多包涵

我在 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'

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

SELECT * FROM $posts WHERE id NOT IN (SELECT post_id FROM $tags WHERE name IN ('dont','want','these'))

我将如何使用 sqlalchemy API 实现此目的?

原文由 bazaars 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 597
2 个回答

使用否定 any 简单:

 query = session.query(Post).filter(~Post.tags.any(Tag.name.in_(['dont', 'want', 'these'])))

原文由 van 发布,翻译遵循 CC BY-SA 3.0 许可协议

试试这个,简单:

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

希望这可以帮助!

原文由 aIKid 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题