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

时间:2011-05-21 04:14:48

标签: python google-app-engine

  

可能重复:
  How to get something random in datastore (AppEngine)?

我正在尝试从当前的200集中获取20个随机记录,我假设这个记录将在一个月内增长到20,000+。在Google AppEngine中使用Python。

  • 这是一个iPhone API,用户可以点击“刷新”以获得另一个随机的20。

我已经阅读了很多答案,但似乎没有一个正常工作,或者足够随机。任何帮助都会很棒。

我目前的代码,只获得最新的20。

  

items = ItemUser.all()。filter('is_active =',True).order(' - image_date')。fetch(limit = 2)

一些代码示例也很棒,因为我从一个坚实的Django背景出发后仍然围绕着Python。

3 个答案:

答案 0 :(得分:2)

App引擎不支持对实体选择的查询。你可能拥有的最好的选择是向有问题的实体添加一个属性并给它一个随机的整数值(在创建它的时候,比如0 .. 2 ** 64-1。

然后你只需要根据该值一次获取一个实体,在该范围内选择一些随机值并使第一个实体低于随机数。得到20,你必须执行20次查询。

由于一次获取一个实体并不能很好地利用您的配额,因此您应该只定期生成一组随机实体,而不是每个请求。

答案 1 :(得分:1)

来自“相关问题”:"How to get something random in datastore"

链接帖子也有代码示例。

答案 2 :(得分: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的所有键的列表,并且有一个方法可以从List中返回这些键的随机数。然后,您只需使用该键的子集进行批量获取。