Flask使用jsonify序列化Flask-SQLAlchemy的Stocks实例报错如何处理
问题原因
报错是因为Flask默认的JSON序列化器无法直接序列化Flask-SQLAlchemy的模型类实例,你需要先将实例转换为它的字符串表示形式,再传入jsonify。
方案1:临时适配(仅当前场景使用)
直接在生成列表时,将每个Stocks实例转成字符串即可,修改代码如下:
r = { "stocks": [str(stock) for stock in current_user.stocks] }
调用jsonify(r)即可直接输出你要求的格式。
方案2:全局适配(所有场景都可直接序列化Stocks实例)
如果项目中多处需要序列化Stocks实例,可以自定义Flask的JSON编码器,步骤如下:
- 首先给Stocks模型类补充序列化逻辑,也可以直接复用实例的字符串表示:
class Stocks(db.Model): # 你原来的字段定义 id = db.Column(db.Integer, primary_key=True) symbol = db.Column(db.String(10), unique=True) def __str__(self): return f"<Stocks {self.symbol}>" def to_json(self): # 如果以后需要返回字段字典也可以在这里定义,当前需求直接返回str即可 return str(self)
- 自定义Flask的JSON编码器,处理Stocks类型的实例:
from flask.json import JSONEncoder class CustomJSONEncoder(JSONEncoder): def default(self, obj): if isinstance(obj, Stocks): return obj.to_json() # 其他自定义类型处理可以加在这里 return super().default(obj) # 绑定到你的Flask应用实例 app.json_encoder = CustomJSONEncoder
配置完成后,你原来的代码不需要修改,直接调用jsonify(r)就可以正常序列化。
内容的提问来源于stack exchange,提问作者lipebromf
相关产品推荐
相关产品推荐

