如何从数据存储区获取一组唯一的随机条目

时间:2011-05-12 15:46:22

标签: python google-app-engine datastore

我使用了来自this thread的稍微修改过的解决方案来从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获取唯一的项目?

2 个答案:

答案 0 :(得分:0)

不要单独提取N个项目,只需对random_number&gt; =新random_number的三个项目进行提取。

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

答案 1 :(得分:0)

您可以检查以确保实体的密钥在添加之前不在图像列表中,如果是,则重新查询。只需确保数据库中至少有count项,否则它将无限循环。