Как получить набор уникальных случайных записей из хранилища данных

Я использовал слегка измененное решение из этого потока, чтобы получить набор случайно выбранных элементов из 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?


person Sergei Basharov    schedule 12.05.2011    source источник


Ответы (2)


Вместо того, чтобы извлекать N элементов по отдельности, просто выполните выборку для трех элементов, где random_number> = новое random_number.

Обратной стороной является то, что вы иногда будете получать 0–2 элемента, и в этом случае, если вам абсолютно необходимы 3 элемента, вы можете повторно получить остальные с другим случайным числом (или переключите> = на ‹)

person Jason Hall    schedule 12.05.2011
comment
Этот метод будет работать для одного запроса, но вы обрекаете группы элементов на то, чтобы их часто выбирали вместе (при условии отсутствия новых записей в хранилище данных), что снижает случайность. - person Justin Morgan; 13.05.2011
comment
Чтобы решить эту проблему, переназначьте их случайные числа при их получении. - person Jason Hall; 13.05.2011

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

person Justin Morgan    schedule 12.05.2011