ChatGPT解决这个技术问题 Extra ChatGPT

在 django 中批量创建模型对象

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

使用 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()

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

似乎正在为此code.djangoproject.com/ticket/19527实施修复
想知道 list.save_all 吗?您几乎可以回答自己,只需解释这个疑惑并使用主题问题中的 2 个第一个词。

A
Amin Mir

在 django 开发中,存在 bulk_create 作为对象管理器方法,它将使用类构造函数创建的对象数组作为输入。查看 django 文档


但是请记住,bulk_create 有一些限制,例如如果它是 save() 自动执行的 AutoField,它不会创建主键。
@HiteshGarg,现在仍然如此吗?
@RaydelMiranda,是的,它仍然是真的。它就在文档中:If 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).
使用 Django 3.0.x 并且我确认使用 bulk_create() 不会触发任何信号。我想知道为什么。
d
daaawx

使用 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")
])

在 Django 1.10 中更改:添加了在使用 PostgreSQL 时在使用 bulk_create() 创建的对象上设置主键的支持。
T
Thorin Schiffer

为我工作,为循环使用手动事务处理(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/…
此方法不能完全扩展,因为您实际上是在每个 for 循环传递上进行创建,这等于每次传递的 db 交互。批量创建似乎工作得更快。
是的,这是很久以前回答的,你现在应该使用 bulk_create()
Y
Yagmur SAHIN
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)

I
Ivan Klass

以下是如何从列分隔文件批量创建实体,将所有取消引用和取消转义例程放在一边:

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)

O
OmerGertel

使用 create 将导致对每个新项目进行一次查询。如果你想减少 INSERT 查询的数量,你需要使用别的东西。

我使用批量插入代码段取得了一些成功,尽管代码段已经很老了。也许需要进行一些更改才能使其再次运行。

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


M
MrJ

查看 bulkops 模块上的这篇博文。

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


z
zEro

对于单行实现,您可以在地图中使用 lambda 表达式

map(lambda x:MyModel.objects.get_or_create(name=x), items)

在这里,lambda 将项目列表中的每个项目与 x 匹配,并在必要时创建数据库记录。

Lambda Documentation


您可能想提到 lambda 必须 map 超过 itemsmap(lambda name: MyModel.objects.get_or_create(name = name), items)
贾,那是我想说的另一种方式(:
D
Daniel Roseman

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

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

+1。如果 name 是唯一的并且可能有重复输入,那么使用 get_or_create 将是一个好主意。
这如何回答这个问题? Model.objects.create 等价于 object = MoModel(..) object.save()。这不是在一笔交易中完成的......