Как получить набор уникальных случайных записей из хранилища данных - PullRequest
1 голос
/ 12 мая 2011

Я использовал слегка измененное решение из этой темы , чтобы получить набор случайно выбранных предметов из хранилища данных. Я использую 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 голосов
/ 13 мая 2011

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

0 голосов
/ 12 мая 2011

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

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

...