2011-05-12 18 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) 

このようにして、任意の数のランダムに選択した項目を取得します。しかし、重複が現れることもあります。データストアから一意のアイテムだけを効果的に取得するにはどうすればよいですか?

答えて

0

N個のアイテムを別々にフェッチするのではなく、random_number> =新しいrandom_numberの3つのアイテムをフェッチしてください。

欠点は、時々あなたは絶対にあなたが別の乱数との残りの部分を再フェッチ(または> =に<切り替え)

+0

この方法は1つのクエリでは機能しますが、(データストアへの新しい書き込みがないと仮定して)頻繁に一緒に選択されるアイテムのグループを作っています。 –

+1

これに対処するには、乱数をフェッチするときに乱数を再割り当てします。 –

0
をすることができます3つの項目を必要とする場合、その場合には0-2の項目を、取得することです

エンティティのキ​​ーが追加する前にエンティティのキ​​ーに含まれていないことを確認することができます。データベースに少なくともcount個のアイテムがあるかどうかを確認してください。さもなければ、無限にループします。

関連する問題