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()
我创建了以下模型:
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()