如何从数据库中获取大量随机记录?

时间:2017-07-31 12:03:24

标签: python django

我知道这个问题已被多次询问,但大多数答案都使用这种方法:MyModel.objects.order_by('?')[:4]这将在生产的第二天杀死数据库。

我正在寻找一种更快速,更轻量级的解决方案,我现在正在使用下面的解决方案,但我想获得超过1个随机查询(例如4个)。

views.py

last = MyModel.objects.count() - 1
random_int = random.randint(0, last)
records = MyModel.objects.all()[random_int] #one record only

任何解决方案?

3 个答案:

答案 0 :(得分:2)

使用关键字并生成随机的数字样本

random_num_sample =  random.sample(range(0, last), 4)
records = MyModel.objects.filter(id__in=random_num_sample)

如果数据库频繁删除,则该解决方案不可行, 如果删除不是中等,您仍然可以通过随机化使用超过4个元素的样本来使用以下

答案 1 :(得分:2)

只要您需要合理数量的元素(例如4),我就会根据查询集索引而不是id进行抽样。缺点是您需要4个查询而不是1个,但这样您就可以获得一致的性能,而不依赖于主键值之间的间隙数量和大小。

count = MyModel.objects.count()
sample =  random.sample(range(count), 4)
records = [MyModel.objects.all()[i] for i in sample]

索引查询集使用LIMITOFFSET,因此索引基于数据库中的行数,而不是基于ID。

答案 2 :(得分:1)

您可以使用in关键字。

random_num = [random.randint(0, last) for i in range(4)]

然后使用

queryset_obj = MyModel.objects.filter(id__in=random_num)