2011-05-12 4 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

Этот метод будет работать для одного запроса, но вы обрекаете группы элементов, которые часто выбираются вместе (при отсутствии новых записей в хранилище данных), что уменьшает случайность. –

+1

Чтобы устранить это, переназначьте их случайные числа при их получении. –

0

Вы можете просто проверить, чтобы ключ объекта не был в вашем списке изображений, прежде чем добавлять его, и запрашивать, если это так. Просто убедитесь, что у вас есть как минимум count элементов в базе данных, иначе цикл будет бесконечным.

Смежные вопросы