Mat*_*ick 29 python random django sql-order-by django-models
如何使用Django获得两个不同的随机记录?我已经看到了关于如何获得一个的问题,但我需要获得两个随机记录,它们必须不同.
Cry*_*ops 97
order_by('?')[:2]对于具有大量行的表,其他答案建议的解决方案实际上是一件非常糟糕的事情.它导致ORDER BY RAND()SQL查询.作为一个例子,这里是mysql如何处理(其他数据库的情况没有太大差别).想象一下,你的表有十亿行:
ORDER BY RAND(),它需要一个RAND()列来排序.注意:只是为了一点额外的肉汁,请注意mysql最初会尝试在RAM中创建临时表.当它耗尽时,它会将所有内容都置于保持状态以将整个内容复制到磁盘上,因此您几乎可以在整个过程中获得额外的I/O瓶颈.
怀疑者应该查看生成的查询以确认它是ORDER BY RAND()Google的"按rand()排序"(带引号).
一个更好的解决方案是交换一个非常昂贵的查询三个便宜的(限制/偏移而不是ORDER BY RAND()):
import random
last = MyModel.objects.count() - 1
index1 = random.randint(0, last)
# Here's one simple way to keep even distribution for
# index2 while still gauranteeing not to match index1.
index2 = random.randint(0, last - 1)
if index2 == index1: index2 = last
# This syntax will generate "OFFSET=indexN LIMIT=1" queries
# so each returns a single record with no extraneous data.
MyObj1 = MyModel.objects.all()[index1]
MyObj2 = MyModel.objects.all()[index2]
Run Code Online (Sandbox Code Playgroud)
Bar*_*tek 25
如果你在ORM中指定随机运算符我很确定它会给你两个截然不同的随机结果吗?
MyModel.objects.order_by('?')[:2] # 2 random results.
Run Code Online (Sandbox Code Playgroud)
dni*_*t13 10
对于未来的读者.
获取所有记录的ID列表:
my_ids = MyModel.objects.values_list('id', flat=True)
my_ids = list(my_ids)
Run Code Online (Sandbox Code Playgroud)
然后从以上所有id中选择n个随机id:
n = 2
rand_ids = random.sample(my_ids, n)
Run Code Online (Sandbox Code Playgroud)
并获取这些ID的记录:
random_records = MyModel.objects.filter(id__in=rand_ids)
Run Code Online (Sandbox Code Playgroud)
Object.objects.order_by('?')[:2]
这将返回两个随机排序的记录.你可以加
distinct()
Run Code Online (Sandbox Code Playgroud)
如果数据集中有相同值的记录.
| 归档时间: |
|
| 查看次数: |
12256 次 |
| 最近记录: |