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

myqueryset = Content.objects.filter(random 100)
34
задан TIMEX 17 August 2010 в 20:30
поделиться

2 ответа

Content.objects.all().order_by('?')[:100]

См. Документы order_by . Также имейте в виду, что этот подход плохо масштабируется (на самом деле, он очень, очень плохо масштабируется). См. этот ответ SO , чтобы узнать, как лучше обрабатывать случайный выбор, когда у вас есть большие объемы данных.

65
ответ дан 27 November 2019 в 16:28
поделиться

Если вы собираетесь сделать это более одного раза, вам нужно спроектировать это в своей базе данных.

Если вы сделаете это один раз, вы можете позволить себе заплатить огромный штраф. Это дает вам ровно 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 ваших данных. Чтобы получить 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 )

Это быстро и воспроизводимо. Подмножества являются «произвольными», а не технически «случайными».

10
ответ дан 27 November 2019 в 16:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: