【问题标题】:Can't use SQLAlchemy model object in view无法在视图中使用 SQLAlchemy 模型对象
【发布时间】:2017-03-05 21:59:12
【问题描述】:

我正在尝试将 SQLAlchemy 模型传递给视图:

class Bandwidth(db.Model):
    __tablename__ = 'bandwidth'
    id = db.Column('id', db.Integer, primary_key=True)
    ping = db.Column('ping', db.Integer)
    download = db.Column('download', db.Float)
    upload = db.Column('upload', db.Float)
    timestamp = db.Column('timestamp', db.DATETIME)

    def __init__(self, ping, download, upload, timestamp):
        self.ping = ping
        self.download = download
        self.upload = upload
        self.timestamp = timestamp

我从 db 获取数据并通过以下方式将其传递给视图:

list = Bandwidth.query.all()
return render_template('index.html',list=list)

最后它在尝试执行时失败:

{% for item in list %}
   <tr>
     <td>{{ item.timestamp.strftime('%d.%m.%Y %H:%M') }}</td>
     <td>{{ '%s' % item.ping }}</td>
     <td>{{ '%0.2f' % item.download }}</td>
     <td>{{ '%0.2f' % item.upload }}</td>
   </tr>
{% endfor %}

发生的错误是:TypeError: <__main__.bandwidth object at> is not JSON serializable

我在哪里做错了?

【问题讨论】:

    标签: python flask jinja2 flask-sqlalchemy


    【解决方案1】:

    你可以序列化模型。

    class Bandwidth(db.Model):
        __tablename__ = 'bandwidth'
        id = db.Column('id', db.Integer, primary_key=True)
        ping = db.Column('ping', db.Integer)
        download = db.Column('download', db.Float)
        upload = db.Column('upload', db.Float)
        timestamp = db.Column('timestamp', db.DATETIME)
    
        @property
        def serialize(self):
            return {
                'id': self.id,
                'ping': self.ping,
                ...
            }
    
    from flask import jsonify
    list = Bandwidth.query.all()
    serialized = [item.serialize for item in list]
    return render_template('index.html',list=serialized)
    

    【讨论】:

    • 我假设在最后一行它必须是jsonify(序列化)。但是我的视图仍然有错误。 TypeError: cannot convert dictionary update sequence element #0 to a sequence
    • 我刚刚删除了 jsonify 并将最后一行更改为返回 render_template('index.html',list=serialized),它的工作原理就像一个魅力。谢谢你的建议。
    猜你喜欢
    • 2016-10-09
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 2013-03-24
    相关资源
    最近更新 更多