在Django中批量创建模型对象

ygya80vv  于 2023-10-21  发布在  Go
关注(0)|答案(8)|浏览(131)

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

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

q43xntqr

q43xntqr1#

在Django开发的时候,有一个bulk_create作为对象管理器方法,它接受一个使用类构造函数创建的对象数组作为输入。查看Django文档

7gs2gvoe

7gs2gvoe2#

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

nbnkbykc3#

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)
t3irkdon

t3irkdon4#

对我来说,使用手动事务处理循环(postgres 9.1)是有用的:

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

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

2hh7jdfx

2hh7jdfx5#

下面是如何从列分隔的文件批量创建实体,而不考虑所有取消引号和取消转义的例程:

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)
t1qtbnec

t1qtbnec6#

使用create将导致每个新项目一个查询。如果你想减少重复查询的数量,你需要使用其他的东西。
我使用Bulk Insert代码段取得了一些成功,尽管该代码段相当旧。也许需要做一些改变才能让它重新工作。
http://djangosnippets.org/snippets/446/

f2uvfpb9

f2uvfpb97#

看看这篇关于bulkops模块的博客文章。
在我的django 1.3应用程序上,我经历了显著的加速。

eaf3rand

eaf3rand8#

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

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

相关问题