Django 1.4 - 带有列表的bulk_create

sna*_*ies 8 python django

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

如果不循环遍历列表,我怎么能这样做,我认为,这将取消bulk_create的意义.

例如:

代替...

for x in list:
    bulk_create...
Run Code Online (Sandbox Code Playgroud)

我怎么能...

bulk_create for the entire list at once in an efficient manner
Run Code Online (Sandbox Code Playgroud)

列表包含:

list = ['abc', 'def', 'ghi']
Run Code Online (Sandbox Code Playgroud)

它只是一个id的列表,而不是准备好直接输入bulk_create的形式(没有使用输入字段格式化).但是,我想在将列表传递给bulk_create之前可以修改它.

jdi*_*jdi 25

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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

values = [{headline="abc"}, {headline="def"}, {headline="ghi"}]
aList = [Entry(**vals) for vals in values]
Run Code Online (Sandbox Code Playgroud)


And*_*dge 5

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

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

>>> my_objects = [MyObject(a=x['a'], b=x['b']) for x in orig_list]
>>> MyObject.objects.bulk_create(my_objects)
Run Code Online (Sandbox Code Playgroud)