使用大量内存的Django查询

时间:2018-02-05 03:03:55

标签: django

我的查询导致应用程序出现内存峰值。以下代码旨在显示单个记录,但偶尔会显示5到10条记录。问题是存在将100,000个结果传递给MultipleObjectsReturned的边缘情况。我相信这会导致高内存使用率。代码是:

try:
    record = record_class.objects.get(**filter_params)
    context["record"] = record

except record_class.MultipleObjectsReturned:
    records = record_class.objects.filter(**filter_params)
    template_path = "record/%(type)s/%(type)s_multiple.html" % {"type": record_type}
    return render(request, template_path, {"records": records}, current_app=record_type)

我考虑在过滤查询的末尾添加一个切片,所以它看起来像这样:

records = record_class.objects.filter(**filter_params)[:20]

但代码似乎仍然很慢。有没有办法以不加载整个查询或导致高内存使用的方式将结果限制为20?

1 个答案:

答案 0 :(得分:0)

正如this_django文档所说:

使用Python的数组切片语法的子集将QuerySet限制为一定数量的结果。这相当于SQL的LIMITOFFSET子句。

例如,这将返回前5个对象(LIMIT 5):

  
    
      

Entry.objects.all()[:5]

    
  

因此,似乎“以不加载整个查询的方式将结果限制为20”正在实现。

因此,您的代码因其他原因而变慢。或者你正在以错误的方式检查时间复杂性。