在django中批量创build模型对象

我有很多对象要保存在数据库中,所以我想用它创buildModel实例。

使用django,我可以使用MyModel(data)创build所有的模型实例,然后我想将它们全部保存起来。

目前,我有这样的事情:

 for item in items: object = MyModel(name=item.name) object.save() 

我想知道是否可以直接保存对象列表,例如:

 objects = [] for item in items: objects.append(MyModel(name=item.name)) objects.save_all() 

如何保存一个事务中的所有对象?

从django开发版本1.4开始,存在bulk_create作为一个对象pipe理器方法,它将input一个使用类构造函数创build的对象数组作为input。 检查Django的文档

使用bulk_create()方法。 现在在Django中是标准的: 官方的Django文档bulk_create()

 >>> Entry.objects.bulk_create([ ... Entry(headline="Django 1.0 Released"), ... Entry(headline="Django 1.1 Announced"), ... Entry(headline="Breaking: Django is awesome") ... ]) 

为我工作使用循环(postgres 9.1)手动事务处理:

 from django.db import transaction with transaction.commit_on_success(): for item in items: MyModel.objects.create(name=item.name) 

实际上它与“本地”数据库批量插入不一样,但它可以让你避免/减less传输/ orms操作/ sql查询分析成本

使用create将导致每个新项目一个查询。 如果你想减lessINSERT查询的数量,你需要使用别的东西。

我已经使用大容量插入片段取得了一些成功,即使片段太旧了。 也许有一些变化需要重新工作。

http://djangosnippets.org/snippets/446/

看看这个博客文章在散装模块。

在我的Django 1.3应用程序,我经历了显着的加速。

以下是如何从列分隔文件批量创build实体,抛开所有不引用和不转义的例程:

 SomeModel(Model): @classmethod def from_file(model, file_obj, headers, delimiter): model.objects.bulk_create([ model(**dict(zip(headers, line.split(delimiter)))) for line in file_obj], batch_size=None) 

对于单行实现,您可以在地图中使用lambdaexpression式

 map(lambda x:MyModel.objects.get_or_create(name=x), items) 

在这里,lambda将项目列表中的每个项目与x匹配,并在必要时创build数据库logging。

Lambda文档

最简单的方法是使用create manager方法,它可以在一个步骤中创build和保存对象。

 for item in items: MyModel.objects.create(name=item.name)