微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Google数据存储区:迭代器已经启动-如何使用这些迭代器?

如何解决Google数据存储区:迭代器已经启动-如何使用这些迭代器?

在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) 

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。