Flask_sqlalchemy 多对多查询

Flask_sqlalchemy many to many query

我创建了以下模型:

tag_post = db.Table('tag_post',
    db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'), primary_key=True),
    db.Column('post_id', db.Integer, db.ForeignKey('post.id'), primary_key=True))

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(180))
    body = db.Column(db.Text, nullable=False)
    tags = db.relationship('Tag', secondary=tag_post, backref=db.backref('posts_associated', lazy="dynamic"))
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))

class Tag(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(20))

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    username = db.Column(db.String(64), index=True, unique=True)
    email = db.Column(db.String(120), index=True, unique=True)
    password_hash = db.Column(db.String(128))
    posts = db.relationship('Post', backref='author', lazy='dynamic')

如何使用 tag.id?

查询所有带有标签的帖子

提前致谢

解决方案是使用连接。

您想要所有符合条件的帖子。因此,查询应以 table Post.

开头
Post.query

然后您使用应该适合的两列将 table 帖子与您的联接 table 绑定。在这种情况下,tag_post table 中的 post_id 列和 Post table 中的 id 列。由于您直接使用关联 table,因此使用的列是通过属性 c.

使用名称引用的
Post.query\
    .join(tag_post, tag_post.c.post_id == Post.id)

然后根据您的条件筛选联接的第二列 table。

tag_id = 1
Post.query\
    .join(tag_post, tag_post.c.post_id == Post.id)\
    .filter(tag_post.c.tag_id == tag_id)

由于您需要所有帖子而不仅仅是一个帖子,请使用 all() 关闭请求。

tag_id = 1
tagged_posts = Post.query\
    .join(tag_post, tag_post.c.post_id == Post.id)\
    .filter(tag_post.c.tag_id == tag_id)\
    .all()

下面是同样结果的详细查询,也包括第三个table.

tag_id = 1
tagged_posts = Post.query\
    .join(tag_post, tag_post.c.post_id == Post.id)\
    .join(Tag, tag_post.c.tag_id == Tag.id)\
    .filter(Tag.id == tag_id)\
    .all()