myqueryset = Content.objects.filter(random 100)
В Django, как выбрать 100 случайных записей из базы данных?
Ответ 1
Content.objects.all().order_by('?')[:100]
Смотрите order_by docs. Также имейте в виду, что этот подход не очень хорошо масштабируется (на самом деле он очень сильно масштабируется). См. этот ответ SO для лучшего способа обработки случайного выбора, когда у вас большой объем данных.
Ответ 2
Если вы собираетесь делать это несколько раз, вам нужно создать его в своей базе данных.
Если вы делаете это один раз, вы можете позволить себе заплатить здоровенный штраф. Это дает вам ровно 100 с действительно хорошими случайными свойствами. Однако он использует много памяти.
pool= list( Content.objects.all() )
random.shuffle( pool )
object_list = pool[:100]
Вот еще один алгоритм, который также является медленным, так как он может искать всю таблицу. Он не использует очень много памяти и может не получить ровно 100.
total_count= Content.objects.count()
fraction = 100./total_count
object_list = [ c for c in Content.objects.all() if random.random() < fraction ]
Если вы хотите сделать это несколько раз, вам нужно добавить атрибут Content, чтобы обеспечить эффективную фильтрацию для "случайных" значений. Например, вы можете сделать это.
class Content( models.Model ):
... etc. ...
def subset( self ):
return self.id % 32768
Это разделит ваши данные на 32768 различных подмножеств. Каждое подмножество составляет 1/32768'th ваших данных. Чтобы получить 100 случайных элементов, вам нужны 100 * 32768/total_count подмножества ваших данных.
total_count = Content.objects.count()
no_of_subsets= 100*32768/total_count
object_list = Content.objects.filter( subset__lte=no_of_subsets )
Это быстро и воспроизводимо. Подмножества являются "произвольными", а не технически "случайными".
Ответ 3
Я делаю:
import random
object_list = list(Content.objects.filter(foo=bar).values()[:100])
random.shuffle(object_list)
Запускает только простой запрос MySQL и хорош в производительности.