python - jsonify Flask 中的 SQLAlchemy 结果集

标签 python sqlalchemy flask flask-sqlalchemy

我正在尝试在 Flask/Python 中对 SQLAlchemy 结果集进行 jsonify。

Flask 邮件列表建议使用以下方法 http://librelist.com/browser//flask/2011/2/16/jsonify-sqlalchemy-pagination-collection-result/#04a0754b63387f87e59dda564bde426e :

return jsonify(json_list = qryresult)

但是我收到以下错误:

TypeError: <flaskext.sqlalchemy.BaseQuery object at 0x102c2df90> 
is not JSON serializable

我在这里忽略了什么?

我发现了这个问题:How to serialize SqlAlchemy result to JSON?这看起来非常相似,但我不知道 Flask 是否有一些魔法可以让它更容易,就像邮件列表帖子所建议的那样。

编辑:为了澄清,这就是我的模型的样子

class Rating(db.Model):

    __tablename__ = 'rating'

    id = db.Column(db.Integer, primary_key=True)
    fullurl = db.Column(db.String())
    url = db.Column(db.String())
    comments = db.Column(db.Text)
    overall = db.Column(db.Integer)
    shipping = db.Column(db.Integer)
    cost = db.Column(db.Integer)
    honesty = db.Column(db.Integer)
    communication = db.Column(db.Integer)
    name = db.Column(db.String())
    ipaddr = db.Column(db.String())
    date = db.Column(db.String())

    def __init__(self, fullurl, url, comments, overall, shipping, cost, honesty, communication, name, ipaddr, date):
        self.fullurl = fullurl
        self.url = url
        self.comments = comments
        self.overall = overall
        self.shipping = shipping
        self.cost = cost
        self.honesty = honesty
        self.communication = communication
        self.name = name
        self.ipaddr = ipaddr
        self.date = date

最佳答案

看来您实际上还没有执行您的查询。请尝试以下操作:

return jsonify(json_list = qryresult.all())

[编辑]:jsonify 的问题是,通常对象不能被自动 json 化。甚至 Python 的日期时间也失败了 ;)

我过去所做的是向需要序列化的类添加一个额外的属性(如 serialize)。

def dump_datetime(value):
    """Deserialize datetime object into string form for JSON processing."""
    if value is None:
        return None
    return [value.strftime("%Y-%m-%d"), value.strftime("%H:%M:%S")]

class Foo(db.Model):
    # ... SQLAlchemy defs here..
    def __init__(self, ...):
       # self.foo = ...
       pass

    @property
    def serialize(self):
       """Return object data in easily serializable format"""
       return {
           'id'         : self.id,
           'modified_at': dump_datetime(self.modified_at),
           # This is an example how to deal with Many2Many relations
           'many2many'  : self.serialize_many2many
       }
    @property
    def serialize_many2many(self):
       """
       Return object's relations in easily serializable format.
       NB! Calls many2many's serialize property.
       """
       return [ item.serialize for item in self.many2many]

现在我可以做的 View :

return jsonify(json_list=[i.serialize for i in qryresult.all()])

希望这会有所帮助;)

[编辑 2019]: 如果您有更复杂的对象或循环引用,请使用像 marshmallow 这样的库。 )。

关于python - jsonify Flask 中的 SQLAlchemy 结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7102754/

相关文章:

python - SQLAlchemy: 'Model' 对象不可调用

python-2.7 - 将关系设置为多对多关系

python - Flask-Login 中使用的 "is_authenticated"方法有什么意义?

python - 如何在程序运行时使用 python 从数据库获取新数据而不刷新我的程序

python - 如何抓取受java脚本保护的Hackerearth页面?

python - 如何在没有大量 if/elif/elif/... 条件的情况下查找代码中的数据?

sqlalchemy - 如何更新 SQLAlchemy RowProxy?

python - 如何优化 Flask 的 render_template() 模板

python - 使用函数输入

python - Nosetest 和 Google API : "no module named apiclient.discovery"