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

时间:2010-08-17 20:30:49

标签: python mysql database django

myqueryset = Content.objects.filter(random 100)

3 个答案:

答案 0 :(得分:65)

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

请参阅order_by docs。还要注意这种方法不能很好地扩展(事实上,它实际上非常非常严重地扩展)。如果您有大量数据,请参阅this SO answer以获得更好的方法来处理随机选择。

答案 1 :(得分:10)

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

如果你这样做一次,你可以支付高额罚金。这可以让你获得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 )

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

答案 2 :(得分:1)

我做:

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

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