我正在使用foreignkey过滤模型的对象。结果是30.000条记录,我的共享主机服务器出现内存错误。
如何编写部分查询,说查询限制为1000个结果?
您认为将StreamingHttpResponse用于模板会有帮助吗?
答案 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()