Ответ Джейсона Холла и ответа здесь не ужасны, но, как он упоминает, они также не случайны.Даже выполнение десяти запросов не будет случайным, если, например, все случайные числа сгруппированы вместе.Чтобы все было по-настоящему случайным, вот два возможных решения:
Решение 1
Назначьте индекс каждому объекту хранилища данных, отследите максимальный индекс и выберите случайным образоминдекс каждый раз, когда вы хотите получить случайную запись:
MyObject.objects.filter('index =', random.randrange(0, maxindex+1))
Upside : действительно случайный.Быстро.
Обратная сторона : при добавлении и удалении объектов необходимо правильно поддерживать индексы, что может сделать обе операции операцией O (N).
Решение 2
Назначьте случайное число каждому номеру хранилища данных при его создании.Затем, чтобы получить случайную запись в первый раз, запросите запись со случайным числом, превышающим некоторое другое случайное число, и упорядочьте по случайным числам (то есть MyObject.order('rand_num').filter('rand_num >=', random.random())
).Затем сохраните этот запрос как курсор в memcache.Чтобы получить случайную запись после первого раза, загрузите курсор из кеша памяти и перейдите к следующему пункту.Если после первого элемента нет элемента, выполните запрос еще раз.
Чтобы предотвратить повторение последовательности объектов, при каждом чтении хранилища данных присвойте объекту, который вы только что прочитали, новое случайное число и сохраните его обратнохранилище данных.
Верх : действительно случайный.Нет сложных индексов для обслуживания.
Нижняя сторона : Необходимо отслеживать курсор.Нужно делать пут каждый раз, когда вы получаете случайную запись.