2011-05-12 80 views
1

我使用了一個從this thread稍微修改的解決方案來從數據存儲中獲取一組隨機選擇的條目。我使用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獲取唯一的項目?

回答

0

不是單獨提取N個項目,而是對三個項目進行提取,其中random_number> =新的隨機數。

的缺點是,你會偶爾會0-2項,在這種情況下,如果你確實需要3個項目,你可以重新獲取與另一隨機數的休息(或切換> =到<)

+0

該方法適用於一個查詢,但是您經常一起選擇一組項目(假設沒有對數據存儲的新寫入),從而降低了隨機性。 – 2011-05-12 20:10:03

+1

爲了解決這個問題,當你提取它們時,重新分配它們的隨機數。 – 2011-05-12 20:45:48

0

您可以在追加之前檢查以確保該實體的密鑰不在您的圖像列表中,並且如果是的話,可以重新查詢。只要確保數據庫中至少有count項目,否則它將無限循環。