Django如何洗牌查询集而不丢失速度



我想在不损失任何优化和性能速度的情况下对对象列表进行洗牌。假设我有以下查询:

related_products = Announcement.objects.filter(category=category).exclude(id=announcement.id)
在python中,我将导入随机的模块,然后是random.shuffle(related_products)。但我不确定它是否会在我的视图中存储一些东西,或者使用一些CPU速度或任何我不知道的术语。

所以我想知道什么是最好的方法来优化它。

谢谢!

如果related_products对象的列表相当短,并且在任何情况下都要使用它们,那么最简单的方法就是获取它们,然后对它们进行洗牌。

import random
...
products = random.shuffle( list( related_products) )
for product in products:
...

这是有效的,因为没有对象被复制。主要问题是数量是否可能过多。您可以使用related_products.count()来找出有多少,然后再从DB中获取。

也有queryset.order_by('?')以随机顺序检索,但文档说"注意:order_by('?')查询可能是昂贵和缓慢的,这取决于你使用的数据库后端。">

抽样的第三种可能是只获取表中每行的主键。对这些对象进行洗牌和切片以获得所需大小的样本,然后只获取这些对象。

product_pks = related_products.values_list('pk', flat=True)
sampled_pks = random.shuffle( list(product_pks))[:N_SAMPLE]
products = related_products.filter( pk__in = sampled_pks )

不知道这将如何执行,但它是两个DB查询,第一个获取洗牌所需的最小数据量。

相关内容

  • 没有找到相关文章

最新更新