谷歌数据存储:迭代器已经启动-如何使用这些迭代器



我得到错误"迭代程序已启动";当将数据存储查询的结果与AppEngine/Flask/Python一起使用时,我们将不胜感激。

我在谷歌数据存储中有很多用户,每个用户都有一个"角色",这个数字在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) 

在不同的地方调查发现,数据存储查询的结果不是字典列表,而是迭代器对象,如:

<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']

我今天偶然发现了这个错误,发现原因是将迭代器转换为列表,然后通过for循环访问所有元素触发了这个错误。

因此,初始化客户端,获取查询,而不是

if len(list(results)) == 0: 
print("Nothing found")
for item in results: #error
print(item.key.id)

do,

value_exists = False
for item in results:
print(item.key.id)
value_exists = True

最新更新