首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Flask中对SQLAlchemy结果集进行jsonify

在Flask中对SQLAlchemy结果集进行jsonify
EN

Stack Overflow用户
提问于 2011-08-18 13:24:10
回答 13查看 160.8K关注 0票数 135

我正在尝试在Flask/Python中对SQLAlchemy结果集进行json化。

Flask邮件列表建议使用以下方法http://librelist.com/browser//flask/2011/2/16/jsonify-sqlalchemy-pagination-collection-result/#04a0754b63387f87e59dda564bde426e

代码语言:javascript
运行
复制
return jsonify(json_list = qryresult)

然而,我得到了以下错误:

代码语言:javascript
运行
复制
TypeError: <flaskext.sqlalchemy.BaseQuery object at 0x102c2df90> 
is not JSON serializable

我在这里忽略了什么?

我发现了这个问题:How to serialize SqlAlchemy result to JSON?,它看起来非常相似,但是我不知道Flask是否像邮件列表帖子所说的那样有魔力让它变得更容易。

编辑:为了澄清,这是我的模型的样子

代码语言:javascript
运行
复制
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
EN

回答 13

Stack Overflow用户

发布于 2015-01-15 04:16:05

以下是通常对我来说足够的东西:

我创建了一个序列化混合,用于我的模型。序列化函数基本上获取SQLAlchemy检查器公开的任何属性,并将其放入字典中。

代码语言:javascript
运行
复制
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()函数。

代码语言:javascript
运行
复制
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) ):

代码语言:javascript
运行
复制
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))
票数 50
EN

Stack Overflow用户

发布于 2012-03-17 08:42:52

我也有同样的需求,需要序列化到json中。看看this question吧。它展示了如何以编程方式发现列。因此,我创建了下面的代码。它适用于我,我将在我的web应用程序中使用它。祝你编码愉快!

代码语言:javascript
运行
复制
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__)
票数 38
EN

Stack Overflow用户

发布于 2013-01-15 00:20:06

这是我的方法:https://github.com/n0nSmoker/SQLAlchemy-serializer

pip安装SQLAlchemy-序列化程序

您可以轻松地将mixin添加到模型中,而不只是在它的实例上调用.to_dict()方法

你也可以在SerializerMixin的基础上编写你自己的混音器

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7102754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档