Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django/postgreSQL中从数据库中获取一个随机项?_Python_Django_Postgresql - Fatal编程技术网

Python 如何在Django/postgreSQL中从数据库中获取一个随机项?

Python 如何在Django/postgreSQL中从数据库中获取一个随机项?,python,django,postgresql,Python,Django,Postgresql,所以我得到了database.objects.all()和database.objects.get('name'),但是我如何从数据库中获得一个随机项呢。我在尝试找出如何让它选择一个随机项目时遇到了问题。Aamir的解决方案将在丢弃除一个之外的所有对象之前选择所有对象。这是非常浪费的,而且,这种计算应该在数据库中进行 model.objects.all().order_by('?')[0] 请在此处阅读更多信息: 编辑:如图所示,lazerscience的答案确实更快 从所有数据库对象的列表中

所以我得到了database.objects.all()和database.objects.get('name'),但是我如何从数据库中获得一个随机项呢。我在尝试找出如何让它选择一个随机项目时遇到了问题。

Aamir的解决方案将在丢弃除一个之外的所有对象之前选择所有对象。这是非常浪费的,而且,这种计算应该在数据库中进行

model.objects.all().order_by('?')[0]
请在此处阅读更多信息:


编辑:如图所示,lazerscience的答案确实更快

从所有数据库对象的列表中选择一个随机元素不是一个很好的解决方案,因为检索数据库的所有元素会对性能产生很大的影响,使用
order_by('?')
也不是一个很好的解决方案,如中所述

最好的解决方案应该是使用随机索引检索元素:

import random

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

我会做稍微不同的事情。在django,Querysets是懒惰的

import random

def get_my_random_object():
    object = random.choice(model.objects.all())
    return object

这也很慢,正如您在提供的链接中所看到的:
注意:order_by(“?”)查询可能既昂贵又缓慢…
您不认为Model.objects.all()很昂贵吗?请参阅我编辑的答案。您是否有解释/基准测试表明此速度比(“?”)[0]快?我知道文档是怎么说的,但这里的关键是DB只选择1个项目,因此速度实际上是相同的(如果DB引擎相当智能)。order_by(“?”)只有在您实际获取多行时才会非常慢。@AamirAdnan:当然,费用将取决于您的记录数,可能它适用于少数记录,但如果您使用
值列表
,您将拥有数百万条记录,django需要获取每个对象的
id
。@Delyan:数据库必须对所选表中的所有记录应用随机排序,然后才能检索第一个元素!一篇关于mysql的文章:@lazerscience:我的观点是正确的,你是对的。有点……)请看这个要点——我用SQL重新创建了Python代码,以避免Python和Postgres之间的跳转。我运行它的表很小,但需要注意的是ORDER BY RANDOM()的执行时间始终很慢。随机偏移备选方案的运行时间取决于随机索引本身!按索引排序(即强制索引扫描)使结果更加一致,但仍随偏移量变化。但是,你是对的,它更快。
random.choice()
调用
len(queryset)
(如中所示)。这将评估整个queryset,并在拾取单个元素之前将其拉入内存。