修改Flask-SQLAlchemy查询结果

0 投票
1 回答
1504 浏览
提问于 2025-04-18 15:15

我想在把从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)

查询结果和分页结果之间有什么区别,让后者可以直接修改而前者不行?我该怎么在不使用分页的情况下修改结果呢?

1 个回答

1

在这两个例子中,你都把 items 传给了模板。不过,这里的 items 值在每个例子里是不同的。

在第一个例子中,items 是来自 Items.query 的查询对象。这个值可以被遍历,所以 for 循环可以正常工作。但是,这些项目需要存储在一个永久的地方。在模板中,这个查询又被遍历了一遍,返回了新的 Items 实例,而这些实例在视图中并没有被修改。

在第二个例子中,itemspaginate 的结果,也就是一个 Items 的列表。当你修改每个项目时,它仍然保存在这个列表里,再次在模板中遍历时,得到的还是同样的项目。

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

撰写回答