批量在django中创建模型对象

Ale*_*eau 78 django django-models

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

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

目前,我有类似的东西:

for item in items:
    object = MyModel(name=item.name)
    object.save()
Run Code Online (Sandbox Code Playgroud)

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

objects = []
for item in items:
    objects.append(MyModel(name=item.name))
objects.save_all()
Run Code Online (Sandbox Code Playgroud)

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

ecb*_*tln 82

从django开发版本1.4开始,存在bulk_create一个对象管理器方法,它将使用类构造函数创建的对象数组作为输入.看看django docs

  • Django的'bulk_create`文档:https://docs.djangoproject.com/en/dev/ref/models/querysets/#bulk-create (11认同)
  • @RaydelMiranda,是的,这仍然是事实。它就在文档中:“如果模型的主键是 AutoField,它不会像 save() 那样检索和设置主键属性,除非数据库后端支持它(目前只有 PostgreSQL)。” (5认同)
  • 但请记住,bulk_create 有一些限制,例如,如果它是 save() 自动创建的 AutoField,则它不会创建主键。 (3认同)
  • 使用 **Django 3.0.x** 并且我确认使用 `bulk_create()` 不会触发任何信号。我想知道为什么。 (2认同)

Dan*_*nil 32

使用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")
])
Run Code Online (Sandbox Code Playgroud)

  • Django 1.10 中的更改:添加了在使用 PostgreSQL 时对使用bulk_create() 创建的对象设置主键的支持。 (2认同)

Yag*_*HIN 9

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)
Run Code Online (Sandbox Code Playgroud)


evi*_*nan 5

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

from django.db import transaction
with transaction.atomic():
    for item in items:
        MyModel.objects.create(name=item.name)
Run Code Online (Sandbox Code Playgroud)

实际上它与“本机”数据库批量插入不同,但它允许您避免/减少传输/orms 操作/sql 查询分析成本

  • 这略有改变。现在事务不再有 `commit_on_success`。您应该使用`transaction.atomic()` 请参阅:/sf/ask/1530284521/ (2认同)