Django 获取随机对象

新手上路,请多包涵

我正在尝试从模型 A 中获取随机对象

目前,它与这段代码配合得很好:

 random_idx = random.randint(0, A.objects.count() - 1)
random_object = A.objects.all()[random_idx]

但我觉得这段代码更好:

 random_object = A.objects.order_by('?')[0]

哪一个是最好的?使用第一个代码删除对象可能有问题?因为,例如,我可以有 10 个对象,但是 ID 为 10 的对象已经不存在了?我是否误解了 A.objects.all()[random_idx] 中的某些内容?

原文由 Erwan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 680
2 个回答

刚刚一直在看这个该行:

 random_object = A.objects.order_by('?')[0]

据报道,它已经关闭了许多服务器。

不幸的是,Erwans 代码在访问非顺序 ID 时导致错误。

还有另一种简短的方法可以做到这一点:

 import random

items = list(Product.objects.all())

# change 3 to how many random items you want
random_items = random.sample(items, 3)
# if you want only a single random item
random_item = random.choice(items)

这样做的好处是它可以毫无错误地处理非顺序 ID。

原文由 lukeaus 发布,翻译遵循 CC BY-SA 4.0 许可协议

改进以上所有内容:

 from random import choice

pks = A.objects.values_list('pk', flat=True)
random_pk = choice(pks)
random_obj = A.objects.get(pk=random_pk)

我们首先在不加载任何 Django 对象的情况下获得潜在主键列表,然后我们随机选择一个主键,然后我们只加载所选对象。

原文由 km6 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏