Jason Halls Antwort und the one here sind nicht schrecklich, aber wie er erwähnt, sind sie auch nicht wirklich zufällig. Selbst zehn Abfragen sind nicht zufällig, wenn zum Beispiel die Zufallszahlen alle zusammen gruppiert sind. Um die Dinge wirklich zufällig, hier sind zwei mögliche Lösungen:
Lösung 1
einen Index zu jedem Datenspeicher-Objekt zuweisen, verfolgen den maximalen Index, und zufällig wählen Sie jedes Mal eine Index, den Sie erhalten möchten ein Zufallsergebnis:
MyObject.objects.filter('index =', random.randrange(0, maxindex+1))
Upside: Wirklich zufällig. Schnell.
Down-Seite: Sie müssen Indizes beim Hinzufügen und Löschen von Objekten richtig pflegen, was beide Operationen zu einer O (N) -Operation machen kann.
Lösung 2
eine Zufallszahl an jede Datenspeicher-Nummer zuweisen, wenn sie erstellt wird. Um dann einen Zufallsdatensatz das erste Mal zu erhalten, fragen Sie nach einem Datensatz mit einer Zufallszahl, die größer als eine andere Zufallszahl ist, und nach den Zufallszahlen (d. H. MyObject.order('rand_num').filter('rand_num >=', random.random())
). Speichern Sie dann diese Abfrage als einen Cursor im Memcache. Um nach dem ersten Mal einen zufälligen Datensatz zu erhalten, laden Sie den Cursor aus dem Memcache und gehen Sie zum nächsten Element. Wenn nach dem ersten Element kein Element mehr vorhanden ist, führen Sie die Abfrage erneut aus.
Um zu verhindern, dass sich die Reihenfolge der Objekte bei jedem gelesenen Datenspeicher wiederholt, geben Sie der gerade gelesenen Entität eine neue Zufallszahl und speichern sie wieder im Datenspeicher.
Nach oben: Wahrlich zufällig. Keine komplexen Indizes zu pflegen.
Down-Seite: Sie müssen einen Cursor verfolgen. Sie müssen jedes Mal, wenn Sie eine zufällige Aufzeichnung erhalten, einen Put machen.
möglich Duplikat von [Abfrage von N zufälligen Datensätzen auf Appengine Datenspeicher] (http://stackoverflow.com/questions/1105004/querying-for-n-random-records-on-appengine-datastore) –