Flask 中实现多对多关系查询:以文章与分类为例
本文详细解析在 Flask 框架下如何处理文章与分类的多对多关系。通过定义中间关联表 post_class,利用 SQLAlchemy 的 secondary 参数建立双向引用,并演示如何通过分类对象直接获取其下的所有文章列表。
在进行 Flask 开发时,多对多关系的数据库查询是常见且具有一定挑战性的场景。此前我在处理此类问题时曾陷入思路瓶颈,尝试多种方案未果后转向网络搜索,但发现现有资料与实际需求存在差距。基于搜集到的思路并结合自身数据结构,我整理出以下查询方案。首先展示数据库模型定义的关键片段,以便读者建立直观理解。
post_class=db.Table('post_class',
db.Column('post_id',db.Integer(),db.ForeignKey('posts.id')),
db.Column('classifa_id',db.Integer(),db.ForeignKey('fenlei.id')))
class Post(db.Model):#文章表
__tablename__='posts'
id=db.Column(db.Integer,primary_key=True,autoincrement=True)
title=db.Column(db.String(255),unique=True)
text=db.Column(db.Text())
publish_date=db.Column(db.DateTime,default=datetime.datetime.now())
user_id=db.Column(db.Integer,db.ForeignKey('users.id'))
is_recomment=db.Column(db.Boolean,default=False)
comments = db.relationship(
'Comment',
backref='posts',
lazy='dynamic')
tag = db.relationship(
'Tag',
secondary=posts_tags,
backref=db.backref('posts', lazy='dynamic')
)
classname=db.relationship('Classifa',
secondary=post_class,
backref=db.backref('posts'))
def __repr__(self):
return "<Model Post `{}`>".format(self.title)
class Classifa(db.Model):#分类
__tablename__='fenlei'
id=db.Column(db.Integer(),primary_key=True)
name=db.Column(db.String(64))
def __repr__(self):
return self.name
本例涉及三张核心表:文章表、分类表以及用于建立关联的中间表。逻辑上,一篇文章可归属于多个分类,同时一个分类也可包含多篇文章,这正是多对多关系的典型特征。中间表用于维护这种映射关系。当前的具体需求是:根据指定的分类名称,查询出该分类下包含的所有文章列表。
以下是实现该查询功能的具体代码示例。
data=Classifa.query.filter_by(name='数据库').first() data_post=data.posts
实现逻辑直接明了:首先通过分类名称查询到对应的分类对象,随后利用该对象在模型中定义的关联关系(即第三表映射)直接获取所属的文章列表。这一过程看似简单,但在实际思考中容易因对 ORM 映射机制不熟悉而产生困惑。理清模型间的引用关系后,查询操作便变得直观高效。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









