我有很多对象要保存在数据库中,所以我想用它创建模型实例。
使用 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()
如何在一个事务中保存所有对象?
使用 bulk_create()
方法。它现在在 Django 中是标准的。
例子:
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.atomic():
for item in items:
MyModel.objects.create(name=item.name)
事实上,它与“本机”数据库批量插入不同,但它允许您避免/减少传输/orms 操作/sql 查询分析成本
commit_on_success
。您应该使用 transaction.atomic()
请参阅:stackoverflow.com/questions/21861207/…
name = request.data.get('name')
period = request.data.get('period')
email = request.data.get('email')
prefix = request.data.get('prefix')
bulk_number = int(request.data.get('bulk_number'))
bulk_list = list()
for _ in range(bulk_number):
code = code_prefix + uuid.uuid4().hex.upper()
bulk_list.append(
DjangoModel(name=name, code=code, period=period, user=email))
bulk_msj = DjangoModel.objects.bulk_create(bulk_list)
以下是如何从列分隔文件批量创建实体,将所有取消引用和取消转义例程放在一边:
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)
使用 create 将导致对每个新项目进行一次查询。如果你想减少 INSERT 查询的数量,你需要使用别的东西。
我使用批量插入代码段取得了一些成功,尽管代码段已经很老了。也许需要进行一些更改才能使其再次运行。
http://djangosnippets.org/snippets/446/
对于单行实现,您可以在地图中使用 lambda 表达式
map(lambda x:MyModel.objects.get_or_create(name=x), items)
在这里,lambda 将项目列表中的每个项目与 x 匹配,并在必要时创建数据库记录。
lambda
必须 map
超过 items
:map(lambda name: MyModel.objects.get_or_create(name = name), items)
最简单的方法是使用 create
Manager 方法,该方法只需一步即可创建和保存对象。
for item in items:
MyModel.objects.create(name=item.name)
name
是唯一的并且可能有重复输入,那么使用 get_or_create
将是一个好主意。
bulk_create
的 Django 文档:docs.djangoproject.com/en/dev/ref/models/querysets/#bulk-createIf the model’s primary key is an AutoField it does not retrieve and set the primary key attribute, as save() does, unless the database backend supports it (currently only PostgreSQL).
bulk_create()
不会触发任何信号。我想知道为什么。