我有很多要保存在数据库中的对象,所以我想用它创建Model实例。
使用django,我可以使用MyModel(data)
创建所有模型实例,然后我想将它们全部保存。
目前,我有类似的东西:
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()
如何在一个交易中保存所有对象?
答案 0 :(得分:78)
从django开发版本1.4开始,存在bulk_create
作为对象管理器方法,它将使用类构造函数创建的对象数组作为输入。看看django docs
答案 1 :(得分:24)
使用bulk_create()
方法。它现在是Django的标准。
示例:强>
$(".container div").each(function(){
var childs = $(this).children();
if($(childs[1]).is(":empty")){
$(this).hide();
}
});
答案 2 :(得分:4)
让我使用手动事务处理循环(postgres 9.1):
from django.db import transaction
with transaction.commit_on_success():
for item in items:
MyModel.objects.create(name=item.name)
实际上它与'native'数据库批量插入不一样,但是它允许你避免/减少传输/ orms操作/ sql查询分析成本
答案 3 :(得分:3)
以下是如何从列分隔文件批量创建实体,而不考虑所有不引用和不转义的例程:
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)
答案 4 :(得分:2)
对于单行实现,您可以在地图中使用lambda表达式
map(lambda x:MyModel.objects.get_or_create(name=x), items)
这里,lambda将项目列表中的每个项目与x匹配,并在必要时创建数据库记录。
答案 5 :(得分:2)
使用create将导致每个新项目进行一次查询。如果要减少INSERT查询的数量,则需要使用其他内容。
我使用Bulk Insert片段取得了一些成功,即使该片段已经很老了。 也许需要进行一些更改才能让它再次运行。
答案 6 :(得分:2)
在bulkops模块上查看此博文。
在我的django 1.3应用程序中,我经历了显着的加速。
答案 7 :(得分:-17)
最简单的方法是使用create
Manager方法,该方法只需一步即可创建和保存对象。
for item in items:
MyModel.objects.create(name=item.name)