【问题标题】:Modify Flask-SQLAlchemy query result修改 Flask-SQLAlchemy 查询结果
【发布时间】:2014-07-29 22:34:49
【问题描述】:

我想在将 flask-sqlalchemy 查询的结果发送到 render_template() 之前对其进行修改。

视图查询和修改项目:

items = Items.query

for i in items: 
    date = i.__dict__['date']
    i.__dict__['date_modified'] = date.replace('/', '-')

return render_template('index.html', items=items)

模板输出项目时:

{% for i in items %}{{i.date_modified}}{% endfor %} 

调试器中显示此错误:

KeyError: 'date_modified'

但是,如果我修改初始查询以获取分页对象,则不会引发错误并显示修改日期。

items = Items.query
items = items.paginate(page_num, items_per_page, True).items 

for i in items: 
    date = i.__dict__['date']
    i.__dict__['date_modified'] = date.replace('/', '-')

return render_template('index.html', items=items)

Query 结果和 Pagination 结果之间有什么区别,后者允许就地操作而不是前者?如何在不修改分页查询的情况下修改结果?

【问题讨论】:

    标签: python flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    在这两个示例中,您都将items 传递给模板。但是,items 的值在每种情况下都不同。

    在第一个示例中,items 是来自Items.query 的查询对象。这个值可以被迭代,这就是 for 循环起作用的原因。但是这些物品需要永久存放在某个地方。在模板中,再次迭代查询,并返回未在视图中修改的新 Items 实例。

    在第二个示例中,itemspaginate 的结果,Items 的列表。当您修改每个项目时,它仍然存储在列表中,并且在模板中再次对其进行迭代会产生相同的项目。

    要解决第一个示例中的错误,您需要存储对返回项目的引用。最简单的方法是强制查询返回一个列表:items = Items.query.all()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-06
      • 2013-07-24
      • 2019-05-31
      • 2015-07-09
      • 1970-01-01
      • 2018-12-30
      • 2017-09-09
      • 1970-01-01
      相关资源
      最近更新 更多