Flask 中实现多对多关系查询:以文章与分类为例

许南星
许南星
发布时间:2026-10-13 | 3人浏览过
原创

本文详细解析在 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 映射机制不熟悉而产生困惑。理清模型间的引用关系后,查询操作便变得直观高效。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表