将Django查询拆分为子查询集

我有一个模型,里面有大约400万个物体。
我想写一个函数,它可以将查询集的所有对象拆分为长度为100000个对象的子查询集。
例如

all_objects = MyModel.objects.all()

# do the splitting to achieve something like below 
query_set1 = all_objects[0:100000]
query_set2 = all_objects[100000:200000]
# and so on until all objects are within 
query_setn = all_objects[3 900 000:4 000 000]
回答
M
Madison Koepp
2周前

如果在一个突发中处理查询集不适合内存,则可以使用.iterator(…)方法[Django-doc]使其成为一个将在内存中加载块的查询集。优点是,您仍然可以一次枚举一个项,因此大多数API就像普通的查询集一样。

因此,您可以使用:

for item in MyModel.objects.iterator(chunk_size=100_000):
    # …
    pass

如果要删除查询中的所有项,可以使用:

while MyModel.objects.exists():
    MyModel.objects.filter(
        pk__in=[item.pk for item in MyModel.objects.only('pk')[:100_000]]
    ).delete()

这并不是非常有效,但比逐一枚举每一项要好得多。