gpt4 book ai didi

python - 如何使用 Django 获取两条随机记录

转载 作者:IT老高 更新时间:2023-10-28 22:09:39 25 4
gpt4 key购买 nike

如何使用 Django 获得两个不同的随机记录?我已经看到有关如何获得一个的问题,但我需要获得两个随机记录,它们必须不同。

最佳答案

其他答案建议的 order_by('?')[:2] 解决方案实际上对于具有大量行的表来说是一件非常糟糕的事情。它导致 ORDER BY RAND() SQL 查询。例如,下面是 mysql 处理的方式(其他数据库的情况并没有太大的不同)。假设您的表有 10 亿行:

  1. 要完成ORDER BY RAND(),它需要一个RAND()列来进行排序。
  2. 为此,它需要一个新表(现有表没有这样的列)。
  3. 为此,mysql 使用新列创建一个新的临时表,并将现有的 10 亿行数据复制到其中。
  4. 这样做时,它会按照您的要求进行操作,并为每一行运行 rand() 以填充该值。是的,您已经指示 mysql 生成 10 亿个随机数。这需要一段时间。 :)
  5. 几小时/几天后,当它完成后,现在必须对其进行排序。是的,您已指示 mysql 对这 10 亿行、最坏情况排序的表进行排序(最坏情况,因为排序键是随机的)。
  6. 几天/几周后,当它完成后,它会忠实地抓取您实际需要的两行并为您返回它们。不错的工作。 ;)

注意:只是为了一点额外的肉汁,请注意 mysql 最初会尝试在 RAM 中创建该临时表。当这用尽时,它会暂停一切以将整个内容复制到磁盘,因此您几乎在整个过程中都会遇到额外的 I/O 瓶颈。

怀疑者应该查看生成的查询以确认它是 ORDER BY RAND() 然后谷歌搜索“order by 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]

关于python - 如何使用 Django 获取两条随机记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1731346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com