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我在这里俯瞰什么
3 回答
holdtom
TA贡献1805条经验 获得超10个赞
我有同样的需要,序列化为json。它显示了如何以编程方式发现列。所以,从那以后我创建了下面的代码。它适用于我,我将在我的网络应用程序中使用它。快乐的编码!
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__)
青春有我
TA贡献1784条经验 获得超8个赞
这通常对我来说足够了:
我创建了一个序列化mixin,我和我的模型一起使用。序列化函数基本上获取SQLAlchemy检查器公开的任何属性并将其放入dict中。
from sqlalchemy.inspection import inspectclass 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
mixin类扩展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))
添加回答
举报
0/150
提交
取消