为了账号安全,请及时绑定邮箱和手机立即绑定

j在Flask中重复SQLAlchemy结果集

j在Flask中重复SQLAlchemy结果集

梦里花落0921 2019-08-09 17:23:43
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__)


查看完整回答
反对 回复 2019-08-09
?
青春有我

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]

现在所需要的只是使用Serializermixin类扩展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))


查看完整回答
反对 回复 2019-08-09
  • 3 回答
  • 0 关注
  • 655 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信