Подтвердить что ты не робот

В Django, как выбрать 100 случайных записей из базы данных?

myqueryset = Content.objects.filter(random 100)
4b9b3361

Ответ 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 и хорош в производительности.