【问题标题】:Google Datastore: iterator already started - How to work with these iterators?Google Datastore:迭代器已经启动 - 如何使用这些迭代器?
【发布时间】:2020-09-04 15:13:32
【问题描述】:

在使用 AppEngine/Flask/Python 的 Datastore 查询结果时,我收到错误“迭代器已启动”,希望能得到一些帮助。

我在 Google 数据存储区中有许多用户,每个用户都有一个“角色”,它是一个 0..10 范围内的数字。 列出用户时,我想为角色 0 的用户打印“管理员”,为所有其他用户打印“用户”。

html模板文件中的相关sn-p在这里:

 {% 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) 

当然有更好的方法。有什么建议吗?

谢谢!

【问题讨论】:

    标签: python google-app-engine google-cloud-datastore


    【解决方案1】:

    试试:

    users = list(q_users.fetch())
    

    另外,在模板中测试each_user['role']

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      • 1970-01-01
      • 1970-01-01
      • 2014-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多