13

我有一个列表,我想在数据库中批量创建条目。

如果不遍历列表,我怎么能做到这一点,我认为这会消除 bulk_create 的意义。

例如:

代替...

for x in list:
    bulk_create...

我怎么能...

bulk_create for the entire list at once in an efficient manner

列表包含:

list = ['abc', 'def', 'ghi']

它只是一个 id 列表,而不是可以直接输入 bulk_create 的形式(不使用输入字段格式化)。但是,我认为可以在将列表传递给 bulk_create 之前对其进行修改。

4

3 回答 3

32

bulk_create在一次调用中将对象列表作为单个 arg。您在示例中所做的与循环和执行相同create()

参考:https ://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.bulk_create

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

aList指的是您已经实例化并需要通过一个查询批量创建的对象列表。例如,如果您还没有未保存的实例列表,并且您有一个值列表,那么您可以使用以下内容创建列表:

values = ['abc', 'def', 'ghi']
# a list of unsaved Entry model instances
aList = [Entry(headline=val) for val in values]

或者,也许您有一个映射到模型的原始字典值列表:

values = [{headline="abc"}, {headline="def"}, {headline="ghi"}]
aList = [Entry(**vals) for vals in values]
于 2012-05-21T19:33:19.587 回答
3
>>> Entry.objects.bulk_create([
...     Entry(headline="Django 1.0 Released"),
...     Entry(headline="Django 1.1 Announced"),
...     Entry(headline="Breaking: Django is awesome")
... ])

您正在向 ORM 传递一个列表中的实例化对象列表。使用它,并假设 orig_list 是一个字典列表,

>>> my_objects = [MyObject(a=x['a'], b=x['b']) for x in orig_list]
>>> MyObject.objects.bulk_create(my_objects)
于 2012-05-21T19:33:38.107 回答
1

试试这个,bulk_create 的目的是只点击一次数据库,不管你创建了多少。这就是为什么我们认为它是有效的。

class Entry(models.Model):
    name = models.CharField(max_length = 10)

a = ['test1', 'test2', 'test3', 'test4']

Entry.objects.bulk_create([Entry(name=x) for x in a])

- -编辑 - -

假设你有一个这样的模型,在你的 models.py 中:

class Entry(models.Model):
    id = models.CharField(max_length = 10)

你有一个这样的列表(直接从你的问题中复制):

list = ['abc', 'def', 'ghi']

只需一行:

Entry.objects.bulk_create([Entry(id=x) for x in list])
于 2012-05-21T19:34:23.210 回答