在Flask中声明一个SQLAlchemy结果集 [英] jsonify a SQLAlchemy result set in Flask

查看:221
本文介绍了在Flask中声明一个SQLAlchemy结果集的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



Flask邮件列表提供了以下方法 librelist.com/browser//flask/2011/2/16/jsonify-sqlalchemy-pagination-collection-result/#04a0754b63387f87e59dda564bde426erel =noreferrer> http://librelist.com/browser//flask/2011/2 / jsonify-sqlalchemy-pagination-collection-result /#04a0754b63387f87e59dda564bde426e

  return jsonify(json_list = qryresult )

然而,我收到以下错误:

  TypeError:< flaskext.sqlalchemy.BaseQuery object at 0x102c2df90> 
不是JSON序列化

我在这里忽略了什么?



我发现这个问题:如何将SqlAlchemy结果序列化为JSON?,这看起来非常相似,但是我不知道Flask是否有一些神奇的功能让邮件列表的帖子变得更容易。



编辑:澄清,这就是我的模型看起来像$ / b>

  class Rating(db.Model): 
$ b $ __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() )
$ b $ 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 =全部
self.shipping =运输
self.cost =成本
self.honesty =诚实
self.communication = communication
self.name = name
self.ipaddr = ipaddr
self.date = date


解决方案

看来你实际上还没有执行过你的查询。请试试以下内容:

  return jsonify(json_list = qryresult.all())

:jsonify的问题是,通常这些对象不能自动进行json化。甚至Python的日期时间也失败了;)

我通常做的是添加一个额外的属性(比如 serialize )到需要序列化的类:

$ p $ def $ date $ time $ $ $ $ $ $反序列化datetime对象到字符串如果值为None:
return
return [value.strftime(%Y-%m-%d),value.strftime( %H:%M:%S)]

class Foo(db.Model):
#... SQLAlchemy defs here ..
def __init __(self,。 ..):
#self.foo = ...
通过

@property
def serialize(self):
Return object数据以易于序列化的格式
返回{
'id':self.id,$ b $'modified_at':dump_datetime(self.modified_at),
#这是一个例子如何处理Many2Many关系
'many2many':self.serialize_many2many
}
@pr operty
def serialize_many2many(self):

以易于序列化的格式返回对象的关系。
NB!调用many2many的序列化属性。

return [item.serialize for self.many2many中的项目]



<现在的视图,我可以做:

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

希望这有助于;)


I'm trying to jsonify a SQLAlchemy result set in Flask/Python.

The Flask mailing list suggested the following method http://librelist.com/browser//flask/2011/2/16/jsonify-sqlalchemy-pagination-collection-result/#04a0754b63387f87e59dda564bde426e :

return jsonify(json_list = qryresult)

However I'm getting the following error back:

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

What am I overlooking here?

I have found this question: How to serialize SqlAlchemy result to JSON? which seems very similar however I didn't know whether Flask had some magic to make it easier as the mailing list post suggested.

Edit: for clarification, this is what my model looks like

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

解决方案

It seems that you actually haven't executed your query. Try following:

return jsonify(json_list = qryresult.all())

[Edit]: Problem with jsonify is, that usually the objects cannot be jsonified automatically. Even Python's datetime fails ;)

What I have usually done, is to add an extra property (like serialize) to classes that need to be serialized:

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 serializeable 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 serializeable format.
       NB! Calls many2many's serialize property.
       """
       return [ item.serialize for item in self.many2many]

And now for views I can just do:

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

Hope this helps ;)

这篇关于在Flask中声明一个SQLAlchemy结果集的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆