DB中的随机化在python中令人讨厌和更好。但是同时,将所有数据从数据库带到python内存只是忽略大多数结果(尤其是在生产环境中)并不是一个好主意。我们可能还需要某种过滤。
- 所以基本上我们在DB有数据,
- 我们想使用python的rand函数
- 后记会从DB提供所有必需的数据。
基本上,使用2个查询比在DB CPU中随机选择(在DB中计算)或加载整个数据(繁重的网络利用率)要便宜得多。解释的解决方案必须具有可伸缩性,因此尝试在此处进行计划将不适用于特别是带有过滤器,软/硬删除甚至带有is_public标志的生产环境。因为我们生成的随机ID可能会从数据库中删除或在过滤器中被删减。假定max_id(records)== count(records)是一个坏习惯。
(当然,如果您不删除与查询使用的数据相当的百分比,或者您不想使用任何种类的过滤器,并且如果您有信心,可以使用random id,然后可以使用random)
如果您只想要一项。请参阅(@Valter Silva)
import random
mgr = models.Painting.objects
qs = mgr.filter(...)
random_id = random.choice(1, qs.count())-1
random_paint = qs[random_id]
如果您想要n个项目。
import random
req_no_of_random_items = 8
qs = models.Painting.objects.filter(...)
possible_ids = list(qs.values_list('id', flat=True))
possible_ids = random.choices(possible_ids, k=8)
random_paint = qs.filter(pk__in=possible_ids)
或者,如果您想为生产使用更优化的代码,请使用缓存功能获取产品ID:
from django.core.cache import cache
def id_set_cache(qs):
key = "some_random_key_for_cache"
id_set = cache.get(key)
if id_set is None:
id_set = list(qs.values_list('id', flat=True)
cache.set(key, id_set)
retrun id_set