我最近自己也在寻找这样的东西(灵感来自QuerySet.update(),我想你也是).据我所知,目前的生产框架(截至今天的1.1.1)中不存在批量创建.最后,我们为需要批量创建的模型创建了一个自定义管理器,并在该管理器上创建了一个函数,以使用值序列参数构建适当的SQL语句.
像这样的事情(如果这不起作用,很抱歉.希望我已经从我们的代码中可运行地调整了这一点):
from django.db import models, connection
class MyManager(models.Manager):
def create_in_bulk(self, values):
base_sql = "INSERT INTO tbl_name (a,b,c) VALUES "
values_sql = []
values_data = []
for value_list in values:
placeholders = ['%s' for i in range(len(value_list))]
values_sql.append("(%s)" % ','.join(placeholders))
values_data.extend(value_list)
sql = '%s%s' % (base_sql, ', '.join(values_sql))
curs = connection.cursor()
curs.execute(sql, values_data)
class MyObject(models.Model):
# model definition as usual... assume:
foo = models.CharField(max_length=128)
# custom manager
objects = MyManager()
MyObject.objects.create_in_bulk( [('hello',), ('bye',), ('c', )] )
这种方法确实存在非常特定于特定数据库的风险.在我们的示例中,我们希望函数返回刚刚创建的ID,因此我们在函数中有一个特定于postgres的查询,以便从表示对象的表的主键序列生成所需数量的ID.也就是说,与迭代数据并发出单独的QuerySet.create()语句相比,它在测试中的性能要好得多.