使用AppEngine (Python)获取20条随机记录

4 投票
3 回答
933 浏览
提问于 2025-04-16 18:04

可能重复的问题:
如何在数据存储中获取随机内容(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次查询。

因为一次次获取实体并不是很划算,所以你应该定期生成一组随机实体,而不是每次请求都生成。

撰写回答