App Engine GQL查询 - 排序

时间:2012-07-24 19:08:24

标签: python google-app-engine gql

在GAE(python)中合并两个GQLQueries时遇到一些问题。

  fp_events = db.GqlQuery("SELECT * FROM Event WHERE firstPlayer=:1", alias).fetch(mylimit)
  sp_events = db.GqlQuery("SELECT * FROM Event WHERE secondPlayer=:1", alias).fetch(mylimit)
  events = fp_events.append(sp_events)

但是,当我尝试使用for循环for event in events:迭代这些事件时,我在该行遇到TypeError: 'NoneType' object is not iterable错误。我怀疑这与我试图做的追加有关,虽然我不完全确定。

这些事件也有一个日期时间属性...我怎样才能按时间对结果事件列表进行排序,降序?虽然我可以在上面的两个查询中使用ORDER BY time DESC,但它们的合并并不一定能保证排序。

我还应该提到Event表的firstPlayer和secondPlayer属性是互斥的(没有事件将firstPlayer和secondPlayer都设置为同一个播放器)。

感谢 - 你!

1 个答案:

答案 0 :(得分:2)

您可以使用list将可迭代对象转换为Python列表:

fp_events = db.GqlQuery("SELECT * FROM Event WHERE firstPlayer = :1", alias).fetch(mylimit)
sp_events = db.GqlQuery("SELECT * FROM Event WHERE secondPlayer = :1", alias).fetch(mylimit)

要合并这两个列表,请尝试以下方法:

fp_events_list = list(fp_events)
sp_events_list = list(sp_events)
events = fp_events_list + sp_events_list

我刚刚在远程shell中尝试使用我自己的AppEngine数据存储区之一,它确实有效。

我担心为了获得您想要的排序,您必须使用the sorted builtin对它们进行排序:

sorted_events = sorted(events, key=lambda event: event.time)