App Engine GQL查询 - 排序 [英] App Engine GQL Query - Sorting

查看:173
本文介绍了App Engine GQL查询 - 排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

但是,当我尝试使用for循环来遍历事件中的事件时:,我得到一个 TypeError:'NoneType'对象在该行不可迭代错误。我怀疑这与我尝试做的追加有关,尽管我不完全确定。



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



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



感谢您!

解决方案

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

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

结合这两个列表,试试这个:

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

I只是在远程中试过e shell对我自己的AppEngine数据存储区之一,它绝对有效。



恐怕为了得到你想要的排序,你必须使用排序后的内容进行排序:

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


Having some issues with merging two GQLQueries in GAE (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)
  events = fp_events.append(sp_events)

However, when I try to iterate through these events using the for loop for event in events:, I get a TypeError: 'NoneType' object is not iterable error at that line. I suspect that this has something to do with the append I attempt to do, though I'm not entirely sure.

These events also have a datetime property... how could I sort the resulting events list by time, descending? While I could use ORDER BY time DESC in the two queries above, their merger isn't necessarily guaranteed to be sorted.

I should also mention that the firstPlayer and secondPlayer properties for the Event table are mutually exclusive (no event has both firstPlayer and secondPlayer set to the same player).

Thank-you!

解决方案

You can use list to convert the iterable objects into Python lists:

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)

To combine the two lists, try this:

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

I just tried that out in the remote shell against one of my own AppEngine datastores, and it definitely works.

I'm afraid that in order to get the sorting that you want, you'll have to use sort them with the sorted builtin:

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

这篇关于App Engine GQL查询 - 排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆