批量在django中创建模型对象

时间:2010-08-31 11:23:03

标签: django django-models

我有很多要保存在数据库中的对象,所以我想用它创建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()

如何在一个交易中保存所有对象?

8 个答案:

答案 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匹配,并在必要时创建数据库记录。

Lambda Documentation

答案 5 :(得分:2)

使用create将导致每个新项目进行一次查询。如果要减少INSERT查询的数量,则需要使用其他内容。

我使用Bulk Insert片段取得了一些成功,即使该片段已经很老了。 也许需要进行一些更改才能让它再次运行。

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

答案 6 :(得分:2)

bulkops模块上查看此博文。

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

答案 7 :(得分:-17)

最简单的方法是使用create Manager方法,该方法只需一步即可创建和保存对象。

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