在Django中如何从数据库中选择100条随机记录?
myqueryset = Content.objects.filter(random 100)
当然可以!请把你想要翻译的内容发给我,我会帮你把它变得更简单易懂。
3 个回答
1
我做的是:
import random
object_list = list(Content.objects.filter(foo=bar).values()[:100])
random.shuffle(object_list)
这个只运行一个简单的MySQL查询,性能很好。
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 ]
如果你想多次进行这个操作,就需要给内容添加一个属性,以便有效地筛选“随机”值。例如,你可以这样做。
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 )
这样做很快,而且结果是可以重复的。这些子集是“任意的”,而不是真正意义上的“随机”。
73
Content.objects.all().order_by('?')[:100]
查看order_by 文档。另外要注意,这种方法在处理大量数据时效果不好(实际上,效果非常差)。想了解在数据量大时如何更好地随机选择,可以参考这个回答。