2010-11-18 35 views
30

我在Django的在线文档中没有看到关于此主题的任何内容。关于在Django中批量保存对象的问题

我想将对象列表保存到数据库,但我可以做的是循环访问列表并在每个对象上调用save()。

那么Django多次访问数据库?或者Django会做一个批量保存呢?

+0

也许值得改变接受的答案,现在bulk_create()在django 1.4中可用并且在 – DMTintner 2015-11-07 14:35:04

回答

10

不幸的是,批量插入是Django 1.3和之前不直接支持的东西。如果你想使用ORM,那么你必须在每个单独的对象上调用save()。如果它是一个很大的列表并且性能是一个问题,那么可以使用django.db.cursor在事务内部手动插入项目,以显着加快该过程。如果你有一个庞大的数据集,你需要开始查看数据库引擎特定的方法,比如Postgres中的COPY FROM。

+3

中可用,这对于django 1.5是否仍然如此? – maazza 2013-04-17 10:45:35

+6

否 - 请参阅下面的答案。从1.4开始,'bulk_create()'将处理高效的批量数据插入。 (https://docs.djangoproject.com/en/1.5/ref/models/querysets/#bulk-create) – 2013-04-24 02:44:17

+1

复制From还是更好,然后bulk_create? – sharafjaffri 2014-01-08 07:44:52

1

This可能是一个很好的起点,但正如代码片段的作者所说,它可能不是生产准备好的。

35

从Django 1.4起,在QuerySet对象上存在一个bulk_create()方法,它允许在单个查询中插入对象列表。欲了解更多信息,请参见:

+0

非常好!那么我应该升级到1.4。 – netvope 2012-05-24 19:42:08

+0

bulk_create非常棒,但遗憾的是它不支持继承模型。任何想法来处理? – 2014-09-24 08:14:31

+0

特别要注意,“如果模型的主键是一个AutoField,它不会检索并设置主键属性,除非数据库后端支持它(当前PostgreSQL)](https:// docs。 djangoproject.com/en/dev/ref/models/querysets/#bulk-create)”。 – Ninjakannon 2017-07-31 21:46:00

2

从Django的1.4存在bulk_create(),但始终却。

您需要小心,使用bulk_create()它不会在内部调用实例save()方法。

由于Django文档说

模型的save()方法将不会被调用

所以,如果你是压倒一切的保存方法,(因为我的情况是)不能使用bulk_create。