Django:如何计算查询集并返回切片而不会两次击中DB?

Ben*_*enz 8 python mysql django

我的API中有这部分代码,最近已成为一个瓶颈:

total = results.count()
if request.GET.has_key('offset'):
    offset = int(request.GET.get('offset').strip())
    results = results.order_by('name')[100*offset:100*(offset+1)]
people = list(results)
Run Code Online (Sandbox Code Playgroud)

请注意,这results是所有人的查询集,并且offset是用于分页的参数.

在这里我可以看到,当我打印connection.queries,我的数据库中获取由打两.count()list(results).之所以.count()必须处于最顶端是因为我需要所有人的长度(不是100).有没有办法解决这个问题?

MrA*_*ley 0

也许是这样的?:

allpeople = list(results.order_by('name'))
total = len(allpeople)
if request.GET.has_key('offset'):
    offset = int(request.GET.get('offset').strip())
    results = allpeople[100*offset:100*(offset+1)]
people = results
Run Code Online (Sandbox Code Playgroud)

请记住,如果不触发, withpeople = results将会失败。if request.GET....:

  • 我不同意这个答案,因为我们不知道返回的结果数量。将 QuerySet 包装在“list()”中会导致对其进行求值,并将所有结果放入内存中。如果您有数百万个结果,这可能是灾难性的。这件事最近发生在我身上,所以我是根据经验说的。 (9认同)