如何使用Django获得两个不同的随机记录?我见过有关如何获得一个记录的问题,但我需要获得两个随机记录,而且它们必须有所不同。
如果你在ORM中指定了随机运算符,我很确定它将为你提供两个不同的随机结果,不是吗?
MyModel.objects.order_by('?')[:2] # 2 random results.
order_by('?')[:2]对于具有大量行的表,其他答案建议的解决方案实际上是一件非常糟糕的事情。它导致一个ORDER BY RAND()SQL查询。例如,这是mysql处理该问题的方式(其他数据库的情况没有太大不同)。假设你的表有十亿行:
order_by('?')[:2]
ORDER BY RAND()SQL
ORDER BY RAND()
RAND()
怀疑者应查看生成的查询,以确认该查询是否是ORDER BY RAND()Google的“按rand()订购”(带有引号)。
ORDER BY RAND()Google
更好的解决方案是将一个真正昂贵的查询换成三个便宜的查询(限制/偏移量而不是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]