django对大型查询集进行分页和排序

django对大型查询集进行分页和排序,django,Django,我想在每次数据库搜索中点击数据库一次 用户可以查询数据库,然后对结果进行分页和排序 该数据库包含700个项目 django调试工具栏显示有时查询花费的时间太长 目前,我将初始搜索结果id保存在会话中,并使用它构建一个查询集来对结果进行排序和分页 我想避免这个数据库查询 我在考虑缓存queryset,这样其他用户就可以使用缓存的queryset,而不会碰到数据库 你认为这种方法怎么样? 有什么我错过的吗 companiesID = request.session['selectedComp

我想在每次数据库搜索中点击数据库一次

用户可以查询数据库,然后对结果进行分页和排序

该数据库包含700个项目

django调试工具栏显示有时查询花费的时间太长

目前,我将初始搜索结果id保存在会话中,并使用它构建一个查询集来对结果进行排序和分页

我想避免这个数据库查询

我在考虑缓存queryset,这样其他用户就可以使用缓存的queryset,而不会碰到数据库

你认为这种方法怎么样? 有什么我错过的吗

    companiesID = request.session['selectedCompaniesIDs']

companies = Company.objects.filter(pk__in=companiesID).order_by(type).annotate(num_users=Count('users'))

cd = create_pagination(companies, page)
    PAGINATION_RESULTS_PER_PAGE = 20

def create_pagination(results, page):
    paginator = Paginator(results, PAGINATION_RESULTS_PER_PAGE)

    try:
        res = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        res = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        res = paginator.page(paginator.num_pages)

    return res
1毫秒:

选择
companys\u company
id
companys\u company
name
公司/公司
部门,
公司/公司
子部门
公司/公司
员工人数
公司/公司
地址,
companys\u company
home\u page
companys\u company
career\u url
公司\公司
城市
公司\公司
更新日期
, 将(
companys\u selectedUsercompanys
user\u id
)从中计数为
num\u用户
companys\u company
LEFT OUTER JOIN
companys\u selectedUsercompanys
在(
companys\u company
id
=
companys\u selectedUsercompanys
company\u id
)其中
companys\u company
id
IN(从
companys\u company
中选择U0.
id
U0左侧外部联接
公司\u选择了启用(U0.
id
= U1.
company\u id
)按U0分组。
id
,U0.
名称
,U0.
扇区
, U0.
子部门
,U0.
员工人数
,U0.
地址
,U0.
主页
, U0.
career\uURL
,U0.
城市
,U0.
更新日期
订单按空)分组依据
公司\公司
id
公司\公司
名称
公司\公司
行业
公司\公司
子行业
公司/公司
员工人数
公司/公司
地址
companys\u company
home\u page
companys\u company
career\u url
公司\公司
城市
公司\公司
更新日期
订单 按
公司\u公司
行业
ASC限额20偏移160

11142毫秒:

选择
companys\u company
id
companys\u company
name
公司\公司
行业
公司\公司
子行业
公司/公司
员工人数
公司/公司
地址
companys\u company
home\u page
companys\u company
career\u url
公司\公司
城市
公司\公司
更新日期
, 将(
companys\u selectedUsercompanys
user\u id
)从中计数为
num\u用户
companys\u company
LEFT OUTER JOIN
companys\u selectedUsercompanys
在(
companys\u company
id
=
companys\u selectedUsercompanys
company\u id
)其中
companys\u company
id
IN(从
companys\u company
中选择U0.
id
U0左侧外部联接
公司\u选择了启用(U0.
id
= U1.
company\u id
)按U0分组。
id
,U0.
名称
,U0.
扇区
, U0.
子部门
,U0.
员工人数
,U0.
地址
,U0.
主页
, U0.
career\uURL
,U0.
城市
,U0.
更新日期
订单按空)分组依据
公司\公司
id
公司\公司
名称
公司\公司
行业
公司\公司
子行业
公司/公司
员工人数
公司/公司
地址
companys\u company
home\u page
companys\u company
career\u url
公司\公司
城市
公司\公司
更新日期
订单 按
公司\u公司
行业
ASC限额20抵销340


对于700条记录,这样一个简单的查询不应超过几毫秒。 请向我们展示两个请求(页面==1的请求和页面>1的请求)生成的原始SQL查询及其计时


你的数据库索引正常吗?您是否检查了使用DB客户端执行两个原始sql查询的时间安排?

这似乎是一个已知问题。
我将选择Facebook路线,只显示下一页和上一页。

如果您的数据库只有700个项目,并且每次点击页面时查询时间太长,则您的查询存在严重错误。结果会在几毫秒和几秒钟内返回。我可以;I don’我不知道是什么造成了这种变化。当我分页到第页时会发生这种情况!=1.queryset是相等的。不同的是:paginator.page(page)您可以向我们显示您的查询/过滤器吗?请不要重复问题是注释(num_users=Count('users')),这在用户分页时不会更改。最好的办法是在页面之间保留它,而不是每次都计算它?