猿问

j在Flask中重复SQLAlchemy结果集

j在Flask中重复SQLAlchemy结果集

我正在尝试在Flask / Python中jsonify一个SQLAlchemy结果集。

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

我在这里俯瞰什么

梦里花落0921
浏览 668回答 3
3回答

holdtom

我有同样的需要,序列化为json。它显示了如何以编程方式发现列。所以,从那以后我创建了下面的代码。它适用于我,我将在我的网络应用程序中使用它。快乐的编码!def&nbsp;to_json(inst,&nbsp;cls): &nbsp;&nbsp;&nbsp;&nbsp;""" &nbsp;&nbsp;&nbsp;&nbsp;Jsonify&nbsp;the&nbsp;sql&nbsp;alchemy&nbsp;query&nbsp;result. &nbsp;&nbsp;&nbsp;&nbsp;""" &nbsp;&nbsp;&nbsp;&nbsp;convert&nbsp;=&nbsp;dict() &nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;add&nbsp;your&nbsp;coversions&nbsp;for&nbsp;things&nbsp;like&nbsp;datetime's&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;and&nbsp;what-not&nbsp;that&nbsp;aren't&nbsp;serializable. &nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;=&nbsp;dict() &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;c&nbsp;in&nbsp;cls.__table__.columns: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v&nbsp;=&nbsp;getattr(inst,&nbsp;c.name) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;c.type&nbsp;in&nbsp;convert.keys()&nbsp;and&nbsp;v&nbsp;is&nbsp;not&nbsp;None: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d[c.name]&nbsp;=&nbsp;convert[c.type](v) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d[c.name]&nbsp;=&nbsp;"Error:&nbsp;&nbsp;Failed&nbsp;to&nbsp;covert&nbsp;using&nbsp;",&nbsp;str(convert[c.type]) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;v&nbsp;is&nbsp;None: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d[c.name]&nbsp;=&nbsp;str() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d[c.name]&nbsp;=&nbsp;v&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;json.dumps(d)class&nbsp;Person(base): &nbsp;&nbsp;&nbsp;&nbsp;__tablename__&nbsp;=&nbsp;'person' &nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;=&nbsp;Column(Integer,&nbsp;Sequence('person_id_seq'),&nbsp;primary_key=True) &nbsp;&nbsp;&nbsp;&nbsp;first_name&nbsp;=&nbsp;Column(Text) &nbsp;&nbsp;&nbsp;&nbsp;last_name&nbsp;=&nbsp;Column(Text) &nbsp;&nbsp;&nbsp;&nbsp;email&nbsp;=&nbsp;Column(Text) &nbsp;&nbsp;&nbsp;&nbsp;@property &nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;json(self): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;to_json(self,&nbsp;self.__class__)

青春有我

这通常对我来说足够了:我创建了一个序列化mixin,我和我的模型一起使用。序列化函数基本上获取SQLAlchemy检查器公开的任何属性并将其放入dict中。from&nbsp;sqlalchemy.inspection&nbsp;import&nbsp;inspectclass&nbsp;Serializer(object): &nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;serialize(self): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;{c:&nbsp;getattr(self,&nbsp;c)&nbsp;for&nbsp;c&nbsp;in&nbsp;inspect(self).attrs.keys()} &nbsp;&nbsp;&nbsp;&nbsp;@staticmethod &nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;serialize_list(l): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;[m.serialize()&nbsp;for&nbsp;m&nbsp;in&nbsp;l]现在所需要的只是使用Serializermixin类扩展SQLAlchemy模型。如果有您不希望公开的字段,或者需要特殊格式化的字段,只需覆盖serialize()模型子类中的函数即可。class&nbsp;User(db.Model,&nbsp;Serializer): &nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;=&nbsp;db.Column(db.Integer,&nbsp;primary_key=True) &nbsp;&nbsp;&nbsp;&nbsp;username&nbsp;=&nbsp;db.Column(db.String) &nbsp;&nbsp;&nbsp;&nbsp;password&nbsp;=&nbsp;db.Column(db.String) &nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;... &nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;serialize(self): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;=&nbsp;Serializer.serialize(self) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;del&nbsp;d['password'] &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;d在您的控制器中,您所要做的就是在结果上调用serialize()函数(或者serialize_list(l)如果查询结果列表中):def&nbsp;get_user(id): &nbsp;&nbsp;&nbsp;&nbsp;user&nbsp;=&nbsp;User.query.get(id) &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;json.dumps(user.serialize())def&nbsp;get_users(): &nbsp;&nbsp;&nbsp;&nbsp;users&nbsp;=&nbsp;User.query.all() &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;json.dumps(User.serialize_list(users))
随时随地看视频慕课网APP

相关分类

Python
我要回答