python - Django:使用过滤器随机查询一条记录的最快方法

标签 python mysql django algorithm

从数据库中查询一条满足我的过滤查询的记录的最快方法是什么。

mydb.objects.filter(start__gte='2017-1-1', status='yes').order_by('?')[:1]

这个语句会先查询几千条记录,然后再选择一条,而且很慢,但是我只需要一条,随机一条。什么是最快的?

最佳答案

好吧,我不确定您能否完全按照自己的意愿行事。几个月前我遇到了类似的问题,最后我重新设计了我的后端实现以使其正常工作。

本质上,您希望通过选择一条满足这两个要求的随机记录来缩短查询时间 (start__gte='2017-1-1', status='yes'),但是就像你说的那样,为了让查询这样做,它需要过滤你的整个数据库。这意味着您无法从数据库中获取满足过滤要求的“真实”随机记录,因为过滤本质上需要查看您的所有记录(否则它不会是真正随机的,它只会是它找到的第一个满足您要求的人)。

相反,考虑将所有具有 status='yes' 的记录放在一个单独的关系中,这样您就可以从那里提取随机记录并加入更大的关系。这将使查询时间大大缩短(这是我为使我的代码正常工作而实现的解决方案类型)。

如果你真的想要一个带有正确过滤信息的随机记录,你可能需要使用一些复杂的方法。

你可以使用 custom manager在 Django 中让它只找到一个随机记录,像这样:

class UsersManager(models.Manager):
    def random(self):
        count = self.aggregate(count=Count('id'))['count']
        random_index = randint(0, count - 1)
        return self.all()[random_index]

class User(models.Model):
    objects = UsersManager()
    #Your fields here (whatever they are, it seems start__gte and status are some)!
    objects = UserManager()

然后你可以调用它,只需使用:

User.objects.random()

这可以通过检查您的代码来重复,直到它返回满足您要求的随机记录。我不认为这一定是实现它的最干净或编程上正确的方法,但我认为对于您的特定问题不存在更快的解决方案。

我用了this site作为这个答案的来源,它有更多关于使用这个自定义随机方法的可靠信息!您可能必须更改自定义管理器以满足您自己的需求,但如果您将 random() 方法添加到现有的自定义管理器,它应该能够执行您需要的操作!

希望对您有所帮助!

关于python - Django:使用过滤器随机查询一条记录的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45087192/

相关文章:

android - 如何使位置自动递增并避免在 ListView 中得到重复的结果?

MySQL 开销,是我的查询错误还是应该优化表?

Django rest框架上传多个文件

python - 存储以 tkinter 形式输入的变量

python - 在列表中查找排名和百分比排名

python - 在 Python 中使用日期时间生成简单的日期列表

mysql - 在查询 "LIMIT 1"中使用 "SELECT 1 ..."有意义吗?

Django,DateTimeField(auto_now_add=True) 不工作

python - Django循环模板标签不起作用

python - 如何在字符串列表中的括号之间连接字符串