Django:我可以通过单个方法调用将新模型实例列表添加到数据库吗?

Posted

技术标签:

【中文标题】Django:我可以通过单个方法调用将新模型实例列表添加到数据库吗?【英文标题】:Django: can I add a list of new model instances to the database via a single method call? 【发布时间】:2011-09-20 10:48:37 【问题描述】:

如果我基于某些表单输入创建新模型对象列表,例如,

new_items = []
for name, value in self.cleaned_data.items():
  if name.startswith('content_item_'):
      new_items.append(ContentItem(item=value))

# can I add the entire new_items list to the database in one swoop? 

我在文档中找不到这是否存在问题,这通常是指通过 .save() 方法一次创建一个对象。但是,当您要添加一整套对象时,一次一个似乎效率低下。

谢谢!

【问题讨论】:

【参考方案1】:

https://docs.djangoproject.com/en/dev/ref/models/querysets/#bulk-create

编辑:不幸的是,这不在 1.3 上

原答案

感谢上帝bulk_create

然后你可以这样做:

ContentItem.objects.bulk_create(new_items)

对于那些懒得点击链接的人,这里是文档中的示例:

>>> Entry.objects.bulk_create([
...     Entry(headline="Django 1.0 Released"),
...     Entry(headline="Django 1.1 Announced"),
...     Entry(headline="Breaking: Django is awesome")
... ])

【讨论】:

【参考方案2】:

我相信 Brandon Konkle 对类似问题的回复仍然有效:Question about batch save objects in Django

总结:遗憾的是,不,您必须使用 django.db.cursor 和手动查询来执行此操作。如果数据集很小,或者性能不太重要,那么循环并不是那么糟糕,而且是最简单的解决方案。

另外,请看这张票:https://code.djangoproject.com/ticket/661

【讨论】:

以上是关于Django:我可以通过单个方法调用将新模型实例列表添加到数据库吗?的主要内容,如果未能解决你的问题,请参考以下文章

Django写入数据库,IntegrityError

Django,当单个模型变大时模型拆分?

如何使用 Django Rest Framework 创建多个模型实例?

Laravel/Eloquent 建议覆盖 trait 属性?

Django 在同一模型实例中查找差异

使用 Celery 的单个 Django 模型的每个对象的不同 crontab