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指定处理单个对象:
- 先定义
PassengerInfoSchema用于序列化乘客信息对象:
from marshmallow import Schema, fields class PassengerInfoSchema(Schema): id = fields.Integer() phone = fields.Integer() city = fields.String() gender = fields.String()
- 在
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
相关产品推荐
相关产品推荐

