Je pense que la réponse de Drew Sears ci-dessus (attacher un flottant aléatoire à chaque entité sur créer) a un problème potentiel: chaque élément n'a pas une chance égale d'être choisi. Par exemple, s'il n'y a que 2 entités, et que l'une obtient un rand_num de 0,2499, et l'autre de 0,25, la 0,25 sera choisie presque tout le temps. Cela pourrait ou non avoir de l'importance pour votre application. Vous pouvez résoudre ce problème en changeant le rand_num d'une entité chaque fois qu'elle est sélectionnée, mais cela signifie que chaque lecture nécessite également une écriture.
Et la réponse pix sélectionnera toujours la première clé.
est ici la meilleure solution polyvalente que je pourrais venir avec:
num_images = Image.all().count()
offset = random.randrange(0, num_images)
image = Image.all().fetch(1, offset)[0]
Pas de propriétés supplémentaires nécessaires, mais l'inconvénient est que le nombre() et fetch() à la fois avoir des répercussions sur la performance si le nombre d'images est large.
Dans le cas 'entity is None', vous devez simplement aller chercher la première entité, ordonnée par' rand_num', traitant ainsi les entités comme un tampon circulaire. La façon dont vous le faites actuellement rend la dernière entité très légèrement plus susceptible d'être choisie que toutes les autres. –
Comment cette requête serait-elle indexée? J'ai dû mettre en œuvre une solution pour cela et n'ai pas choisi cette méthode par peur du manque d'efficacité de ce type de requête. Je ne sais pas si mes craintes sont fondées (voir la solution ci-dessous). –
Chaque propriété inclut automatiquement un index croissant et décroissant, à moins que vous ne le désactiviez explicitement. Le code ci-dessus devrait être efficace à l'échelle. Je l'ai mis à jour pour refléter la révision de Nick. –