bar*_*ard 2 javascript python jquery sqlalchemy
我正在使用 Flask、SQLAlchemy 和 javascript。我需要通过 AJAX 将我的查询结果以 json 格式传递给 javascript,但我不断收到此错误:
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <model.Cloud object at 0x7f72e40c5910> is not JSON serializable'
Run Code Online (Sandbox Code Playgroud)
我的代码如下:
@app.route('/past/<user_id>')
def get_past_clouds(user_id):
if user_id:
clouds = model_session.query(model.User).filter_by(id=user_id).first().clouds
if clouds != "":
clouds_d = {}
for idx, cloud in enumerate(clouds):
clouds_d[idx] = cloud
return jsonify(json_list=clouds_d)
return None
Run Code Online (Sandbox Code Playgroud)
忽略我之前的评论,它允许请求工作,但返回的所有对象都未定义。
最后我是这样做的:
clouds_d = dict( (cloud.name, [ photo.to_dict() for photo in cloud.photos ]) for cloud in clouds )
return jsonify(clouds_d)
Run Code Online (Sandbox Code Playgroud)
正如您所发现的,SQLAlchemy 模型本身不能序列化为 JSON。
您采用的方法 - 从模型实例的属性手动构造一个 dict - 可以完成工作,但是如果您需要对多个模型进行 jsonify,处理序列化时的值转换,或支持反序列化(将 JSON 转换回 SQLAlchemy 模型实例)你会发现自己写了很多乏味的代码。
更好的解决方案是使用 SQLAlchemy 的序列化/反序列化扩展库,例如SQLAthanor或Marshmallow-SQLAlchemy(完全披露:我是 SQLAthanor 的作者)。
使用这些库中的任何一个,您基本上都可以将 SQLAlchemy 模型序列化和反序列化为其他格式,或者将它们反序列化回 SQLAlchemy 模型实例。
对于 SQLAthanor,您基本上可以通过一个方法调用来完成工作:
json_result = model_instance.dump_to_json()
Run Code Online (Sandbox Code Playgroud)
或者(使用更多配置可以让您进行更细粒度的控制):
json_result = model_instance.to_json()
Run Code Online (Sandbox Code Playgroud)
您还可以序列化为 dict、YAML 或 CSV。
逆过程是:
model_instance = ModelClass.new_from_json(json_result)
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!