Django查询限制和streamingHttpResponse

时间:2014-08-14 21:42:24

标签: django

我正在使用foreignkey过滤模型的对象。结果是30.000条记录,我的共享主机服务器出现内存错误。

如何编写部分查询,说查询限制为1000个结果?

您认为将StreamingHttpResponse用于模板会有帮助吗?

2 个答案:

答案 0 :(得分:2)

您可以使用Python的数组拼接表示法在Django中轻松限制查询。您可以在任何查询中使用它。以下是一些例子:

# Will return only the first 1000 objects in the query
queryset = MyModel.objects.filter(some_field=some_value)[:1000]  

# Will return only the first 500 objects
queryset = MyModel.objects.all()[:500] 

# Will return the first 1000 objects of the filtered query ordered by the objects pk
queryset = MyModel.objects.filter(some_field=some_value).order_by('pk')[:1000] 

# Will return the 25th through 50th object
queryset = MyModel.objects.all()[25:50] 

# Will return all objects but the first 10
queryset = MyModel.objects.all()[10:] 

Django对此非常聪明,只会查询所需内容然后停止,而不是收集整个查询,然后切断其余部分。

有关详细信息,请参阅documentation here

答案 1 :(得分:0)

您可以使用以下方法。它将遍历按主键排序的 Django 查询集

def queryset_iterator(queryset, chunksize=1000):
    pk = 0
    last_pk = queryset.order_by("-pk")[0].pk
    queryset = queryset.order_by("pk")
    while pk < last_pk:
        for row in queryset.filter(pk__gt=pk)[:chunksize]:
            pk = row.pk
            yield row
        gc.collect()