我正在尝试在Flask/Python中对SQLAlchemy结果集进行json化。
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
发布于 2015-01-15 04:16:05
以下是通常对我来说足够的东西:
我创建了一个序列化混合,用于我的模型。序列化函数基本上获取SQLAlchemy检查器公开的任何属性,并将其放入字典中。
from sqlalchemy.inspection import inspect
class Serializer(object):
def serialize(self):
return {c: getattr(self, c) for c in inspect(self).attrs.keys()}
@staticmethod
def serialize_list(l):
return [m.serialize() for m in l]
现在所需要的就是用Serializer
混合类扩展SQLAlchemy模型。
如果有您不希望公开的字段,或者需要特殊的格式化,只需覆盖模型子类中的serialize()
函数。
class User(db.Model, Serializer):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String)
password = db.Column(db.String)
# ...
def serialize(self):
d = Serializer.serialize(self)
del d['password']
return d
在您的控制器中,您所要做的就是对结果调用serialize()
函数(如果查询结果是列表,则调用serialize_list(l)
):
def get_user(id):
user = User.query.get(id)
return json.dumps(user.serialize())
def get_users():
users = User.query.all()
return json.dumps(User.serialize_list(users))
发布于 2012-03-17 08:42:52
我也有同样的需求,需要序列化到json中。看看this question吧。它展示了如何以编程方式发现列。因此,我创建了下面的代码。它适用于我,我将在我的web应用程序中使用它。祝你编码愉快!
def to_json(inst, cls):
"""
Jsonify the sql alchemy query result.
"""
convert = dict()
# add your coversions for things like datetime's
# and what-not that aren't serializable.
d = dict()
for c in cls.__table__.columns:
v = getattr(inst, c.name)
if c.type in convert.keys() and v is not None:
try:
d[c.name] = convert[c.type](v)
except:
d[c.name] = "Error: Failed to covert using ", str(convert[c.type])
elif v is None:
d[c.name] = str()
else:
d[c.name] = v
return json.dumps(d)
class Person(base):
__tablename__ = 'person'
id = Column(Integer, Sequence('person_id_seq'), primary_key=True)
first_name = Column(Text)
last_name = Column(Text)
email = Column(Text)
@property
def json(self):
return to_json(self, self.__class__)
发布于 2013-01-15 00:20:06
这是我的方法:https://github.com/n0nSmoker/SQLAlchemy-serializer
pip安装SQLAlchemy-序列化程序
您可以轻松地将mixin添加到模型中,而不只是在它的实例上调用.to_dict()方法
你也可以在SerializerMixin的基础上编写你自己的混音器
https://stackoverflow.com/questions/7102754
复制相似问题