Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python queryset_迭代器和Django Paginator之间的差异_Python_Django - Fatal编程技术网

Python queryset_迭代器和Django Paginator之间的差异

Python queryset_迭代器和Django Paginator之间的差异,python,django,Python,Django,我正在和一位同事讨论通过Django ORM迭代大型表的问题。到目前为止,我一直在使用a的实现,如下所示: def queryset_iterator(queryset, chunksize=1000): ''''' Iterate over a Django Queryset ordered by the primary key This method loads a maximum of chunksize (default: 1000) rows in it's

我正在和一位同事讨论通过Django ORM迭代大型表的问题。到目前为止,我一直在使用a的实现,如下所示:

def queryset_iterator(queryset, chunksize=1000):
    '''''
    Iterate over a Django Queryset ordered by the primary key

    This method loads a maximum of chunksize (default: 1000) rows in it's
    memory at the same time while django normally would load all rows in it's
    memory. Using the iterator() method only causes it to not preload all the
    classes.

    Note that the implementation of the iterator does not support ordered query sets.
    '''
    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()
def queryset_迭代器(queryset,chunksize=1000):
'''''
迭代按主键排序的Django查询集
此方法在其存储空间中最多加载chunksize(默认值:1000)行
django通常会同时加载内存中的所有行
记忆。使用迭代器()方法只会导致它不预加载所有
上课。
请注意,迭代器的实现不支持有序查询集。
'''
pk=0
last_pk=queryset.order_by('-pk')[0].pk
queryset=queryset.order\u by('pk')
当pk
我的同事建议使用queryset并将其传递到该文件中。看起来类似的工作也可以完成,我能找到的唯一区别是Paginator不进行任何垃圾收集调用


有人能解释这两者的区别吗?有吗?

这里的实现与Paginator所做的完全不同;几乎没有任何相似之处

您的类遍历整个查询集,一次请求
chunksize
项,每个块都是一个单独的查询。它只能用于非顺序查询,因为它通过调用执行自己的顺序

Paginator没有这样做。它不是用于迭代整个queryset,而是用于从完整qs返回一个页面,它使用切片操作符(映射到限制/偏移)对单个查询执行此操作

另外,我不确定在这里调用
gc.collect
会做什么。垃圾收集器是主存管理系统的附加组件,即引用计数。它只在清理循环引用时有用,没有理由相信这里会创建任何循环引用