mysqldb - python django




Wie wähle ich in Django 100 zufällige Datensätze aus der Datenbank? (2)

Diese Frage hat hier bereits eine Antwort:

myqueryset = Content.objects.filter(random 100)

Wenn Sie dies mehr als einmal tun, müssen Sie dies in Ihrer Datenbank entwerfen.

Wenn Sie es einmal tun, können Sie es sich leisten, die saftige Strafe zu bezahlen. Dies bringt Sie genau 100 mit wirklich guten zufälligen Eigenschaften. Es benötigt jedoch viel Speicher.

pool= list( Content.objects.all() )
random.shuffle( pool )
object_list = pool[:100]

Hier ist ein weiterer Algorithmus, der auch langsam ist, da er die gesamte Tabelle durchsuchen kann. Es verwendet nicht sehr viel Speicher und es kann nicht genau 100 werden.

total_count= Content.objects.count()
fraction = 100./total_count
object_list = [ c for c in Content.objects.all() if random.random() < fraction ]

Wenn Sie dies mehr als einmal tun möchten, müssen Sie dem Inhalt ein Attribut hinzufügen, um eine effektive Filterung nach "zufälligen" Werten zu ermöglichen. Zum Beispiel könnten Sie dies tun.

class Content( models.Model ):
    ... etc. ...
    def subset( self ):
        return self.id % 32768

Dadurch werden Ihre Daten in 32768 unterschiedliche Teilmengen unterteilt. Jede Teilmenge ist 1 / 32768'th Ihrer Daten. Um 100 zufällige Elemente zu erhalten, benötigen Sie 100 * 32768 / total_count-Teilmengen Ihrer Daten.

total_count = Content.objects.count()
no_of_subsets= 100*32768/total_count
object_list = Content.objects.filter( subset__lte=no_of_subsets )

Das ist schnell und reproduzierbar. Die Teilmengen sind "willkürlich", nicht technisch "zufällig".


Ich mache:

import random    
object_list = list(Content.objects.filter(foo=bar).values()[:100])
random.shuffle(object_list)

Führt nur eine einfache MySQL-Abfrage aus und bietet gute Leistung.







django