You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

构建Flask端点:用SQLAlchemy关联表并返回JSON的问题

解决Flask API返回分类-商品目录的问题

我明白你现在的困扰:你想构建一个API,返回每个分类下包含对应所有商品的结构化目录,但当前的join查询方式并没有达到这个效果,反而返回了重复的分类数据(每个商品对应一条分类记录),而不是按分类聚合商品。

问题根源

你当前的session.query(Category).join(Item).all()会执行一个内连接,返回的是每个商品对应的分类对象,所以你的categories列表里会有多个重复的分类实例(一个商品对应一个),序列化后自然无法得到“分类包含多个商品”的结构。

解决方案

假设你的SQLAlchemy模型已经正确设置了关系(比如Category模型里有items = relationship("Item", backref="category")),我们可以调整查询逻辑,先获取所有分类,再为每个分类关联它的商品:

1. 确保模型关系正确

先确认你的模型定义类似这样:

class Category(db.Model):
    __tablename__ = 'catalog'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), nullable=False)
    # 建立和Item的一对多关系
    items = db.relationship('Item', backref='category', lazy=True)

    def serialize(self):
        return {
            'id': self.id,
            'name': self.name,
            # 序列化该分类下的所有商品
            'items': [item.serialize() for item in self.items]
        }

class Item(db.Model):
    __tablename__ = 'items'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), nullable=False)
    description = db.Column(db.Text)
    category_id = db.Column(db.Integer, db.ForeignKey('catalog.id'))

    def serialize(self):
        return {
            'id': self.id,
            'name': self.name,
            'description': self.description
        }

2. 修改路由函数

不需要用join,直接查询所有分类,然后利用模型的关系获取每个分类的商品:

@app.route('/catalog/JSON/')
@login_required
def getCatalog():
    # 查询所有分类,包括没有商品的分类(如果需要的话)
    categories = session.query(Category).all()
    # 序列化每个分类,包含其下的商品
    return jsonify(Catalog=[category.serialize() for category in categories])

额外说明

  • 如果只想返回有商品的分类,可以添加过滤条件:categories = session.query(Category).filter(Category.items.any()).all()
  • 如果你不想修改模型的序列化方法,也可以在路由里手动构造数据:
    return jsonify(Catalog=[
        {
            'id': cat.id,
            'name': cat.name,
            'items': [{'id': item.id, 'name': item.name} for item in cat.items]
        } for cat in categories
    ])
    

这样调整后,你就能得到每个分类下包含所有对应商品的JSON结构了。

内容的提问来源于stack exchange,提问作者meddy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:35:00