使用AppEngine (Python)获取20条随机记录
可能重复的问题:
如何在数据存储中获取随机内容(AppEngine)?
我想从当前的200条记录中随机获取20条,我预计这个数量在一个月内会增长到20000+。我在Google AppEngine上使用Python。
- 这是一个iPhone的API,用户可以点击“刷新”来获取另外20条随机记录。
我看了很多答案,但似乎没有一个能正确工作,或者随机性不够。任何帮助都将非常感谢。
我现在的代码只是获取最新的20条记录。
items = ItemUser.all().filter('is_active =', True).order('-image_date').fetch(limit=2)
如果能提供一些代码示例就太好了,因为我刚从Django转到Python,还在努力适应中。
3 个回答
1
虽然这个方法不太优雅,也不是最有效率的,但可以这样做:
import random
# Get all the keys, not the Entities
item_keys = ItemUser.all(keys_only=True).filter('is_active =', True).order('-image_date').fetch(2000)
# Get a random set of those keys, in this case 20
random_keys = random.sample(item_keys, 20)
# Get those 20 Entities
items = db.get(random_keys)
或者你可以保持一个包含所有ItemUser的键的列表,然后写一个方法,从这个列表中随机返回一些键。接着,你只需要用这部分键进行批量获取。
1
来自“相关问题”:“如何在数据存储中获取随机内容”
链接的帖子里也有代码示例。
2
App Engine不支持对任意选择的实体进行查询。你可以做的最好的办法是给你想要的实体添加一个属性,并在创建时给它一个随机的整数值(比如范围在0到2的64次方减1之间)。
然后,你就可以根据这个值一个一个地获取实体,随机选一个值,然后找到小于这个随机数的第一个实体。如果你想获取20个实体,就得进行20次查询。
因为一次次获取实体并不是很划算,所以你应该定期生成一组随机实体,而不是每次请求都生成。