如何直接在Flask中使用jsonify处理FireO Models这类自定义类?
解决FireO模型与Flask jsonify直接兼容的问题
我当前使用Flask 2.3.2和FireO ORM 2.1.0,FireO模型默认无法直接被Flask的jsonify序列化,必须手动调用to_dict()转换为字典才能传入。现在需要实现直接将FireO模型实例或QueryIterator查询结果传入jsonify的功能。
方案一:自定义Flask JSON编码器
通过扩展Flask的JSON编码器,让它自动识别并处理FireO对象:
from flask import Flask, jsonify from flask.json import JSONEncoder from fireo.models import Model from fireo.queries.query_iterator import QueryIterator class FireOJSONEncoder(JSONEncoder): def default(self, obj): # 处理单个FireO模型实例 if isinstance(obj, Model): return obj.to_dict() # 处理FireO查询迭代器(批量查询结果) elif isinstance(obj, QueryIterator): return [item.to_dict() for item in obj] # 其他类型交给父类默认逻辑处理 return super().default(obj) # 注册自定义编码器到Flask应用 app = Flask(__name__) app.json_encoder = FireOJSONEncoder # 使用示例 @app.route('/users') def get_users(): users = User.collection.fetch() # 返回QueryIterator return jsonify(users), 200 @app.route('/user/<user_id>') def get_user(user_id): user = User.collection.get(user_id) # 返回单个Model实例 return jsonify(user), 200
方案二:扩展FireO基础模型
给FireO模型添加__json__方法,Flask的JSON编码器会自动调用该方法完成序列化:
from fireo.models import Model as FireOModel # 自定义基础模型,添加序列化方法 class Model(FireOModel): def __json__(self): return self.to_dict() # 业务模型继承自定义基础模型 class User(Model): name = TextField() email = TextField()
注意:此方案仅处理单个模型实例,批量查询的
QueryIterator仍需配合方案一的编码器处理,因此更推荐方案一,一次配置即可兼容所有场景。
内容的提问来源于stack exchange,提问作者Caponte
相关产品推荐
相关产品推荐

