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

SQLAlchemy一对一关联查询报错:'PassengerInfoModel'对象不可迭代

问题:SQLAlchemy一对一关联序列化时触发TypeError: 'PassengerInfoModel' object is not iterable

在SQLAlchemy中配置了PassengerModel与PassengerInfoModel的一对一关联关系,但调用GET接口获取乘客列表或详情时,出现以下错误:

TypeError: 'PassengerInfoModel' object is not iterable

相关代码

路由代码

@blp.route("/passenger")
class PassengerList(MethodView):
    @blp.response(200, PassengerSchema(many=True))
    def get(self):
        return PassengerModel.query.all()


@blp.route("/passenger/<string:passenger_id>")
class Passenger(MethodView):
    @blp.response(200, PassengerSchema)
    def get(self, passenger_id):
        passenger = PassengerModel.query.get_or_404(passenger_id)
        return passenger

模型代码

# PassengerInfoModel
from db import db 

class PassengerInfoModel(db.Model):
    __tablename__ = "passengers_info"

    id = db.Column(db.Integer, primary_key=True)
    phone = db.Column(db.Integer, unique=True, nullable=False)
    city = db.Column(db.String(80), unique=False, nullable=False)
    gender = db.Column(db.String(80), unique=False, nullable=False)

    passenger_id = db.Column(
        db.Integer,db.ForeignKey("passengers.id"), unique=False, nullable=False
    )
    passenger = db.relationship("PassengerModel", back_populates="passenger_info")
# PassengerModel
from db import db

class PassengerModel(db.Model):
    __tablename__ = "passengers"

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), unique=True, nullable=False)

    passenger_info = db.relationship("PassengerInfoModel", back_populates="passenger", lazy="select", cascade="all, delete", uselist=False)

问题原因

错误发生在Marshmallow序列化过程中:你的PassengerSchema默认会将passenger_info字段视为可迭代集合(比如列表)处理,但SQLAlchemy通过uselist=False已经将passenger_info定义为单个对象而非列表,序列化时类型不匹配导致报错。

解决方案

需要在Marshmallow Schema中明确配置passenger_info字段的序列化规则,使用嵌套Schema指定处理单个对象:

  1. 先定义PassengerInfoSchema用于序列化乘客信息对象:
from marshmallow import Schema, fields

class PassengerInfoSchema(Schema):
    id = fields.Integer()
    phone = fields.Integer()
    city = fields.String()
    gender = fields.String()
  1. 在PassengerSchema中嵌套PassengerInfoSchema,并指定many=False(表示是单个对象,而非列表):
class PassengerSchema(Schema):
    id = fields.Integer()
    name = fields.String()
    # 配置嵌套序列化,指定处理单个对象
    passenger_info = fields.Nested(PassengerInfoSchema, many=False)

验证

修改Schema后,重新调用http://127.0.0.1:5000/passenger和http://127.0.0.1:5000/passenger/passenger_id接口,即可正常返回包含乘客关联信息的序列化数据,不会再触发迭代错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:55:17