La respuesta de Jason Hall y the one here no son horribles, pero como él menciona, tampoco son realmente aleatorias. Incluso hacer diez consultas no será aleatorio si, por ejemplo, los números aleatorios se agrupan todos juntos. Para mantener las cosas verdaderamente al azar, aquí hay dos soluciones posibles:
solución al 1
Asignar un índice para cada objeto de almacén de datos, realizar un seguimiento del índice máximo y al azar seleccionar un índice cada vez que se desea conseguir un registro aleatorio:
MyObject.objects.filter('index =', random.randrange(0, maxindex+1))
Al revés: verdaderamente aleatoria. Rápido.
Down-side: Debe mantener los índices al agregar y eliminar objetos, lo que puede hacer que ambas operaciones sean una operación O (N).
Solución 2
asignar un número aleatorio a cada número de almacén de datos cuando se crea. Luego, para obtener un registro aleatorio la primera vez, busque un registro con un número aleatorio mayor que algún otro número aleatorio y ordene por los números aleatorios (es decir, MyObject.order('rand_num').filter('rand_num >=', random.random())
). A continuación, guarde esa consulta como un cursor en el Memcache. Para obtener un registro aleatorio después de la primera vez, cargue el cursor desde el Memcache y vaya al siguiente elemento. Si no hay ningún elemento después del primero, vuelva a ejecutar la consulta.
Para evitar que la secuencia de objetos se repita, en cada lectura del almacén de datos, proporcione a la entidad que acaba de leer un nuevo número aleatorio y guárdelo en el almacén de datos.
arriba del lado: verdaderamente aleatoria. No hay índices complejos para mantener.
Abajo: Necesito hacer un seguimiento de un cursor. Necesita hacer un put cada vez que obtenga un registro aleatorio.
posible duplicado de [Consultando N registros aleatorios en el almacén de datos Appengine] (http://stackoverflow.com/questions/1105004/querying-for-n-random-records-on-appengine-datastore) –