python - Google Datastore:迭代器已经启动 - 如何使用这些迭代器?
问题描述
将数据存储区查询的结果与 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 %}
我的第一次,不幸的尝试如下。它因错误“迭代器已启动”而崩溃。(注意 - 这可能有点不准确,因为经过多次更改后我丢失了原件,但你明白了)。
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)
在不同的地方调查发现,Datastore 查询的结果不是字典列表,而是一个迭代器对象,例如:
<google.cloud.datastore.query.Iterator object at 0x.......>
因此,作为一个临时解决方案,我编写了一个循环,遍历迭代器并将实体一个一个复制到一个字典列表中,动态改变角色。它可以工作,但是代码很丑陋并且非常不切实际:
q_users = datastore_client.query(kind='user')
q_users.order = ['first_name']
users = q_users.fetch()
new_u = []
# Loop through iterator returned by Datastore
for u in users:
# Assign a string corresponding to the user's role
if u['role'] == 0:
u_role = 'Admin'
else:
u_role = 'User'
# Now append to the new list of users
new_u.append({'user_id': u['user_id'],
'first_name': u['first_name'],
'last_name': u['last_name'],
'role': u_role})
# Send to screen
return render_template('users_list.html', users=new_u)
肯定有更好的方法。有什么建议么?
谢谢!
解决方案
尝试:
users = list(q_users.fetch())
另外,each_user['role']
在模板中测试。
推荐阅读
- microsoft-graph-api - 无法使用 graph.microsoft.com 获取用户照片
- javascript - 如何使用正则表达式返回段落中的所有内容,但第一句?
- firebase - Error when getting data from StreamBuilder BloC firestore Flutter
- reactjs - 如何解决 React redux 中的数据加载问题
- python - 如何使用 Django-import-export 在 Django Admin 中导入列表用户 csv
- javascript - 如何摆脱d3中的重复值?
- android - 如何使用 Kotlin 在 Firebase 中获取孩子的名字
- swift - 如何使用 SwiftUI 使按钮可拖动/可移动?
- r - 在 R 中设置具有许多级别的数据.frame 的因子数据
- mongodb - MongoDB:使用聚合中的 $lookup 在嵌套文档上填充数组