Django中如何从模型筛选12个随机对象?现有代码仅返回1个如何解决
Django 随机筛选12个模型对象问题解答
原代码问题点
- 变量被重复覆盖:第二个for循环中每次都对
great_proposal重新赋值,循环结束后变量仅保留最后一次的查询结果,所以只能拿到1个对象 - 随机ID可能重复:
random.randint生成的随机数允许重复,就算你把每次查询结果存入列表,也可能出现实际返回对象少于12个的情况 - 未处理ID不连续场景:如果模型有已删除的记录,ID序列不连续,生成的随机ID可能对应不存在的记录,也会导致返回结果数量不足
filter()返回的是QuerySet集合,按ID查询的场景应该用first()取单个对象,避免每次都拿到集合类型的结果
正确实现方案
小数据量表(万级数据以内)
直接用Django内置的随机排序语法,写法最简单:
great_proposal = product.objects.order_by('?')[:12]
该方案直接调用数据库的随机排序能力,代码量最少,缺点是数据量超过十万级时全表排序性能会明显下降。
大数据量表优化方案
如果你使用的表数据量很大,可基于随机ID的思路优化实现,规避上述问题:
import random from django.db.models import Max max_id = product.objects.aggregate(max_id=Max('id'))['max_id'] result = [] used_ids = set() # 循环直到拿到12个有效对象 while len(result) < 12: rand_id = random.randint(1, max_id) # 跳过已经用过的ID,避免重复 if rand_id in used_ids: continue target_item = product.objects.filter(id=rand_id).first() if target_item: result.append(target_item) used_ids.add(rand_id) great_proposal = result
内容的提问来源于stack exchange,提问作者alireza
相关产品推荐
相关产品推荐

