1

我使用了这个线程的一个稍微修改的解决方案,从 Datastore 中获取一组随机选择的项目。我使用 ProtoRPC,虽然它没有太大区别,只是为了您的信息。我的代码如下所示:

@remote.method(RandomImagesRequest, RandomImagesResponse)
def get_random_images(self, request):
    images = []
    count = request.count
    for i in range(0, count):
        random_number = random.random()
        img = Image.all().order('random_number').filter('random_number>=', random_number).get()
        if img is None:
            img = Image.all().order('-random_number').filter('random_number <', random_number).get()
        image_message = ImageMessage(image_url=img.image_url)
        images.append(image_message)
    return RandomImagesResponse(images=images)

这样我就可以得到任意数量的随机选择的项目。但有时会出现重复项。如何有效地仅从 Datastore 中获取唯一项目?

4

2 回答 2

0

无需单独获取 N 个项目,只需获取random_number>= 新随机数的三个项目。

缺点是您偶尔会得到 0-2 个项目,在这种情况下,如果您绝对需要 3 个项目,您可以使用另一个随机数重新获取其余项目(或将 >= 切换为 <)

于 2011-05-12T17:06:11.860 回答
0

您可以在附加之前检查以确保实体的键不在您的图像列表中,并重新查询是否存在。只要确保数据库中至少有count项目,否则它将无限循环。

于 2011-05-12T20:11:16.293 回答