La réponse de Jason Hall et the one here ne sont pas horribles, mais comme il le mentionne, ils ne sont pas vraiment aléatoires non plus. Même faire dix requêtes ne sera pas aléatoire si, par exemple, les nombres aléatoires sont tous regroupés. Pour garder les choses vraiment au hasard, voici deux solutions possibles:
Solution 1
Assigner un index à chaque objet datastore, garder une trace de l'indice maximum et choisir au hasard un index à chaque fois que vous voulez obtenir un dossier au hasard:
MyObject.objects.filter('index =', random.randrange(0, maxindex+1))
Upside: Vraiment au hasard. Vite.
Défaut: Vous devez gérer correctement les index lors de l'ajout et de la suppression d'objets, ce qui peut rendre les deux opérations O (N).
Solution 2
attribuer un numéro aléatoire à chaque numéro de datastore lors de sa création. Ensuite, pour obtenir un enregistrement aléatoire la première fois, recherchez un enregistrement avec un nombre aléatoire supérieur à un autre nombre aléatoire et ordonnez par les nombres aléatoires (c'est-à-dire MyObject.order('rand_num').filter('rand_num >=', random.random())
). Puis enregistrez cette requête en tant que curseur dans le memcache. Pour obtenir un enregistrement aléatoire après la première fois, chargez le curseur du memcache et passez à l'élément suivant. S'il n'y a aucun élément après le premier, réexécutez la requête.
Pour empêcher la répétition de la séquence d'objets, à chaque banque de données lue, donnez à l'entité que vous venez de lire un nouveau nombre aléatoire et enregistrez-la dans le magasin de données.
Vers le haut: Vraiment aléatoire. Aucun indice complexe à maintenir.
Face inférieure: Nécessité de garder la trace d'un curseur. Besoin de faire un put chaque fois que vous obtenez un enregistrement aléatoire.
duplication possible de [Recherche de N enregistrements aléatoires sur le magasin de données Appengine] (http://stackoverflow.com/questions/1105004/querying-for-n-random-records-on-appengine-datastore) –