在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查询的数量,你需要使用别的东西。
我已经使用大容量插入片段取得了一些成功,即使片段太旧了。 也许有一些变化需要重新工作。
看看这个博客文章在散装模块。
在我的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)
- Django:如何pipe理开发和生产环境?
- 多行集合的Django模板中的交替行着色
- 使用django.contrib.auth.views.password_change强制实施密码强度要求
- Django抽象模型与常规inheritance
- 使用Google App Engine的反馈?
- django.core.exceptions.ImproperlyConfigured:加载MySQLdb模块时出错:没有名为MySQLdb的模块
- 如何在Django模板中访问具有嵌套for循环的最外层forloop.counter?
- 只使用Django的数据库部分
- Django的BooleanField作为单选button?