Genau wie zufällig müssen diese sein? Muss es für jeden Benutzer anders sein, oder ist es nur die Erscheinung der Zufälligkeit, die wichtig ist?
Wenn es Letzteres ist, dann können Sie einfach ein Feld namens ordering
zu dem fraglichen Modell hinzufügen und es mit zufälligen Ganzzahlen füllen.
Sonst, wenn das Recordset klein ist (und wenn es paged ist, bezweifle ich es), dann Speichern eines separaten zufälligen Abfrage-Set für jede Sitzung kann ein Speicherproblem sehr schnell werden, wenn Sie wissen, dass die Benutzerbasis sehr ist klein. Hier ist eine mögliche Lösung, die Zufälligkeit, sondern in Wirklichkeit nachahmt erzeugt nur 5 zufällige Mengen:
import random
from django.core import cache
RANDOM_EXPERIENCES=5
def my_view(request):
if not request.session.get('random_exp'):
request.session['random_exp']=random.randrange(0,RANDOM_EXPERIENCES)
object_list = cache.get('random_exp_%d' % request.session['random_exp'])
if not object_list:
object_list = list(Object.objects.all().order_by('?'))
cache.set('random_exp_%d' % request.session['random_exp'], object_list, 100)
paginator = Paginator(object_list, 10)
page = 1 # or whatever page we have
display_list = paginator.page(page)
....
In diesem Beispiel anstelle einen separaten queryset für jeden Benutzer zu schaffen (was zu potentiell tausende querysets in Speicher), und es speichert in request.session (ein weniger effizienter Speichermechanismus als Cache, der so eingestellt werden kann, dass er etwas sehr Effizientes verwendet, wie Memcached), haben wir jetzt nur 5 Abfragesätze im Cache gespeichert, aber hoffentlich eine ausreichend zufällige Erfahrung für die meisten Benutzer. Wenn Sie mehr Zufälligkeit wünschen, sollten Sie den Wert für RANDOM_EXPERIENCES erhöhen. Ich denke, dass man mit wenigen Performanceproblemen bis zu 100 hochgehen könnte.
Wenn sich die Datensätze selbst nur selten ändern, können Sie eine extrem hohe Zeitüberschreitung für den Cache festlegen.
aktualisiert
Hier ist ein Weg, es zu implementieren, die etwas mehr Speicher/Speicher verwendet wird sichergestellt, sondern dass jeder Benutzer ihre queryset lange genug, um ohne Gefahr seines Cache Timeout (unter der Annahme, dass 3 Stunden „on hold“ kann um die Aufzeichnungen zu sehen).
import datetime
...
if not request.session.get('random_exp'):
request.session['random_exp']="%d_%d" % (
datetime.datetime.strftime(datetime.datetime.now(),'%Y%m%dH'),
random.randrange(0, RANDOM_EXPERIENCES)
)
object_list = cache.get("random_exp_%s" % request.session['random_exp'])
if not object_list:
object_list = list(Object.objects.all().order_by('?'))
cache.set(cache_key, "random_exp_%s" % request.session['random_exp'], 60*60*4)
Hier erstellen wir ein zwischengespeichertes Abfrage-Set, das für 4 Stunden nicht ausläuft. Der Schlüssel request.session wird jedoch auf das Jahr, den Monat, den Tag und die Stunde festgelegt, sodass ein ankommender Benutzer einen aktuellen Datensatz für diese Stunde sieht. Jeder, der das Abfrage-Set bereits angezeigt hat, kann es mindestens noch 3 Stunden (oder solange seine Sitzung noch aktiv ist) sehen, bevor es abläuft. Es werden höchstens 5 * RANDOM_EXPERIENCES-Abfragesätze im Cache gespeichert.
nice one - nicht den Cache wie zuvor verwendet - nur um Ansichten zu cachen. scheint einen Sinn zu ergeben. Und du hast Recht - die Zufälligkeit ist nur für den Schein, nicht wirklich zufällig. Vielen Dank. –