在 AppEngine/Flask/Python 中使用数据存储区查询的结果时,我收到错误“迭代器已启动”,希望得到一些帮助。
我在 Google 数据存储区中有许多用户,每个用户都有一个“角色”,它是 0..10 范围内的数字。列出用户时,我想为角色为 0 的用户打印“管理员”,为所有其他用户打印“用户”。
html 模板文件中的相关片段如下:
{% for each_user in users %}
<tr>
<td> <a href="user_display?find={{each_user.user_id}}" >{{ each_user.user_id}}</a></td>
<td> {{ each_user.first_name}} </td>
<td> {{ each_user.last_name}} </td>
<td> {{ each_user.role}} </td>
</tr>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
我的第一次不幸的尝试如下。它崩溃并出现错误“迭代器已启动”。(注意 - 这可能有点不准确,因为我在多次更改后丢失了原件,但你明白了)。
q_users = datastore_client.query(kind='user')
q_users.order = ['first_name']
users = q_users.fetch()
for item in users:
if item['role'] == 0:
item['role'] = "Administrator"
else:
item['role'] = "User"
}
return render_template('users_list.html', users=users)
Run Code Online (Sandbox Code Playgroud)
在不同的地方进行调查发现,数据存储区查询的结果不是字典列表,而是一个迭代器对象,如下所示:
<google.cloud.datastore.query.Iterator object at 0x.......>
Run Code Online (Sandbox Code Playgroud)
因此,作为临时解决方案,我编写了一个循环,遍历迭代器并将实体逐一复制到动态更改角色的字典列表中。它可以工作,但是代码很丑陋并且非常不切实际:
q_users = datastore_client.query(kind='user') …Run Code Online (Sandbox Code Playgroud)