【发布时间】:2012-02-19 22:56:29
【问题描述】:
所以我得到了 database.objects.all() 和 database.objects.get('name') 但是我如何从数据库中获取一个随机项目。我在试图弄清楚如何获得它而不是选择一个随机项目时遇到了麻烦。
【问题讨论】:
标签: python django postgresql
所以我得到了 database.objects.all() 和 database.objects.get('name') 但是我如何从数据库中获取一个随机项目。我在试图弄清楚如何获得它而不是选择一个随机项目时遇到了麻烦。
【问题讨论】:
标签: python django postgresql
从所有数据库对象的列表中选择一个随机元素并不是一个 goog 解决方案,因为检索数据库的所有元素会对性能产生很大影响,order_by('?') 也不会像 django documentation 中提到的那样使用。
最好的解决办法应该是用随机索引检索一个元素:
import random
random_idx = random.randint(0, Model.objects.count() - 1)
random_obj = Model.objects.all()[random_idx]
【讨论】:
values_list 并且您会说数百万记录中,django 需要获取每个对象的id。
Aamir 的解决方案将选择所有对象,然后丢弃除一个之外的所有对象。这非常浪费,而且这种计算应该在数据库中完成。
model.objects.all().order_by('?')[0]
在此处阅读更多信息:https://docs.djangoproject.com/en/dev/ref/models/querysets/#order-by
编辑:lazerscience 的回答确实更快,如图here。
【讨论】:
Note: order_by('?') queries may be expensive and slow...
我会做的略有不同。无论如何,查询集在 django 中都是惰性的。
import random
def get_my_random_object():
object = random.choice(model.objects.all())
return object
https://docs.djangoproject.com/en/dev/topics/db/queries/#querysets-are-lazy https://docs.djangoproject.com/en/dev/ref/models/querysets/#when-querysets-are-evaluated
【讨论】:
random.choice() 调用len(queryset)(如random.py 所示)。这将评估整个查询集并将其拉入内存,然后再选择单个元素。