在Django中,如何从数据库中随机选择100条记录?

2024-04-20 11:29:46 发布

您现在位置:Python中文网/ 问答频道 /正文

myqueryset = Content.objects.filter(random 100)

Tags: objectsrandomcontentfiltermyqueryset
3条回答

我知道:

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

只运行一个简单的MySQL查询,性能良好。

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

请参阅order_by docs。还要注意,这种方法的伸缩性不好(事实上,它的伸缩性非常,非常差)。当您有大量数据时,请参阅this SO answer以获得处理随机选择的更好方法。

如果要多次执行此操作,则需要将其设计到数据库中。

如果你只做一次,你可以付得起高额的罚款。这可以得到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 ]

如果要多次执行此操作,则需要向内容添加一个属性,以便对“随机”值进行有效筛选。例如,您可以这样做。

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

这将把数据划分成32768个不同的子集。每个子集是数据的1/32768。要获得100个随机项,需要100*32768/数据的总数子集。

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

这是快速的而且是可重复的。子集是“任意的”,而不是技术上的“随机的”。

相关问题 更多 >