Python Django:count()的替代方案
我有一个Django应用程序,可以显示分页的搜索结果。每个页面显示20个结果,我在底部有一个分页条,显示小于当前页面的5页和大于当前页面的5页(如谷歌)。问题是,对于分页栏,我调用count()来获取结果的总数,这样我就知道在当前页面之前是否有5页的结果 问题是,更一般的查询可能需要大约10秒钟才能对执行Python Django:count()的替代方案,python,mysql,django,pagination,Python,Mysql,Django,Pagination,我有一个Django应用程序,可以显示分页的搜索结果。每个页面显示20个结果,我在底部有一个分页条,显示小于当前页面的5页和大于当前页面的5页(如谷歌)。问题是,对于分页栏,我调用count()来获取结果的总数,这样我就知道在当前页面之前是否有5页的结果 问题是,更一般的查询可能需要大约10秒钟才能对执行count()。实际上,我并不关心确切的数字,因为我的大多数用户可能永远都不会看到结果的末尾。有没有办法估计count的输出,或者更一般地说,估计查询返回结果的数量 这是我当前的查询,以获取实际
count()
。实际上,我并不关心确切的数字,因为我的大多数用户可能永远都不会看到结果的末尾。有没有办法估计count的输出,或者更一般地说,估计查询返回结果的数量
这是我当前的查询,以获取实际结果
results = Item.objects.filter(title__icontains=query).order_by('views')[offset:limit]
偏移量
和限制
变量指当前页面上显示的结果段。我能看到的解决问题的唯一方法是提前5页的结果段并检查它是否为空。然而,该解决方案有很多边缘情况,如果有更简单的解决方案,我真的不想花一天的时间编写这些代码。也不是理想的解决方案,但可能值得针对您的特定情况进行测试。在以下帮助下,您可以为进行查询的函数引入超时:
。。。或类似的解决方案。您要么需要精确的行数,要么需要将有很多行的信息。这需要进行一些基准测试,以获得正确的timoeout,并且仍然容易受到一些外部因素的影响,但在99.9%的情况下,这可能会很好地发挥作用
此外,它还减少了数据库上的长查询负载。您可以使用EXPLAIN返回qeury需要检查的估计行数。@Raymond nijl,您可以提供一个示例吗?有没有办法通过django使用EXPLAIN,或者我必须编写自己的原始sql?