Tom*_*Tom 65

Content.objects.all().order_by('?')[:100]
Run Code Online (Sandbox Code Playgroud)

请参阅order_by文档.还要注意这种方法不能很好地扩展(事实上,它实际上非常非常严重地扩展).请参阅此SO答案,以便在有大量数据时更好地处理随机选择.

  • 并且all()是多余的,但我永远不记得. (6认同)

S.L*_*ott 10

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

如果你这样做一次,你可以支付高额罚金.这可以让你获得100个非常好的随机属性.但是,它使用了大量内存.

pool= list( Content.objects.all() )
random.shuffle( pool )
object_list = pool[:100]
Run Code Online (Sandbox Code Playgroud)

这是另一种算法也很慢,因为它可能会搜索整个表格.它根本不使用很多内存,它可能不会完全达到100.

total_count= Content.objects.count()
fraction = 100./total_count
object_list = [ c for c in Content.objects.all() if random.random() < fraction ]
Run Code Online (Sandbox Code Playgroud)

如果您想多次执行此操作,则需要向Content添加属性以允许对"随机"值进行有效过滤.例如,您可以这样做.

class Content( models.Model ):
    ... etc. ...
    def subset( self ):
        return self.id % 32768
Run Code Online (Sandbox Code Playgroud)

这会将您的数据划分为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 )
Run Code Online (Sandbox Code Playgroud)

很快,而且可以重现.子集是"任意的"而不是技术上"随机".