如何从 sqlalchemy jsonify 对象?

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)

Chr*_*ski 5

正如您所发现的,SQLAlchemy 模型本身不能序列化为 JSON。

您采用的方法 - 从模型实例的属性手动构造一个 dict - 可以完成工作,但是如果您需要对多个模型进行 jsonify,处理序列化时的值转换,或支持反序列化(将 JSON 转换回 SQLAlchemy 模型实例)你会发现自己写了很多乏味的代码。

更好的解决方案是使用 SQLAlchemy 的序列化/反序列化扩展库,例如SQLAthanorMarshmallow-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)

希望这可以帮助!