当前位置:  开发笔记 > 后端 > 正文

快速查找Django QuerySet中的最后一个元素?

如何解决《快速查找DjangoQuerySet中的最后一个元素?》经验,为你挑选了2个好方法。

我有一个叫做Valor的模特.勇气有一个机器人.我这样查询:

Valor.objects.filter(robot=r).reverse()[0]

让最后一个Valor成为r机器人.Valor.objects.filter(robot = r).count()约为200000,在我的电脑中获取最后一项约需4秒.

我怎样才能加快速度?我在查询错误的方式?



1> Aaron..:

这个问题的最佳mysql语法将是:

SELECT * FROM table WHERE x=y ORDER BY z DESC LIMIT 1

与此相当的django将是:

Valor.objects.filter(robot=r).order_by('-id')[:1][0]

请注意此解决方案如何利用django的切片方法编译对象列表之前限制查询集.



2> Joe Holloway..:

如果以前的建议都没有起作用,我建议将Django从等式中取出并对你的数据库运行这个原始的sql.我猜你的桌名,所以你可能需要相应调整:

SELECT * FROM valor v WHERE v.robot_id = [robot_id] ORDER BY id DESC LIMIT 1;

这慢吗?如果是这样,让您的RDBMS(MySQL?)向您解释查询计划.这将告诉您它是否正在进行任何全表扫描,您显然不希望使用大表.您也可以编辑您的问题并包含valor表格的架构供我们查看.

此外,您可以通过执行此操作来查看Django生成的SQL(使用Peter Rowell提供的查询集):

qs = Valor.objects.filter(robot=r).order_by('-id')[0]
print qs.query

确保SQL类似于我上面发布的"原始"查询.您还可以让您的RDBMS向您解释该查询计划.

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有