在这种情况下如何循环发电机?

时间:2019-06-18 10:04:51

标签: python django

这是问题。

我想使用Django的bulk_create一次保存更多数据。但是我从API获得的原始结果是其中包含数量数据的生成器。所以我想循环使用此生成器并批量保存数据。

我的审判如下:


#  a generator with amount data   
l = (
    item for item in range(1,100230, 1)
)

#  base model table
class ModelDemo(models.Model):
    ...


# main logic code

limit = 2000
while l:
    bulk_list = []
    for index, item in enumerate(l):
        bulk_list.append(
            ModelDemo(
                ...
            )
        )
        if index == limit:
            ModelDemo.objects.bulk_create(bulk_list)
            break

很明显,我会丢失最后的230数据,但现在找不到解决方案。

任何评论都非常受欢迎。非常感谢。

2 个答案:

答案 0 :(得分:1)

这可能有效。

例如:

from itertools import chain, islice
l = (
    item for item in range(1,10230, 1)
)
limit = 2000

def chunks(iterable, size=10):
    iterator = iter(iterable)
    for first in iterator:
        yield chain([first], islice(iterator, size - 1))

data = chunks(l, limit)
while data:
    try:
        bulk_list = []
        for index, item in enumerate(next(data)):
            bulk_list.append(
                ModelDemo(
                    ...
                )
            )
        ModelDemo.objects.bulk_create(bulk_list)
    except:
        break

Reference

答案 1 :(得分:0)

啊!我现在知道您的问题是什么。

您需要做的就是在循环终止后处理最后的清单,该清单太大了。

主要逻辑代码

limit = 2000

bulk_list = []
for index, item in enumerate(l):
    bulk_list.append(
        ModelDemo(
            ...
        )
    )
    if index == limit:
        ModelDemo.objects.bulk_create(bulk_list)
        bulk_list.clear() # reset the batch

ModelDemo.objects.bulk_create(bulk_list)

我不确定while循环是干什么用的。而且你不应该休息。