Я использовал слегка измененное решение из этой темы, чтобы получить набор случайно выбранных предметов из хранилища данных. Я использую 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?
Вы можете просто проверить, чтобы ключ объекта не находился в вашем списке изображений, прежде чем добавлять его, и требуйте, если это так. Просто убедитесь, что у вас есть как минимум count
элементы в базе данных, иначе он будет бесконечно зацикливаться.
Вместо того, чтобы извлекать N элементов отдельно, просто сделайте выборку для трех элементов, где random_number
>= новый random_number.
Недостатком является то, что вы иногда получаете 0-2 элемента, и в этом случае, если вам абсолютно необходимо 3 элемента, вы можете повторно выбрать остальные с другим случайным числом (или переключить >= на a )