我有一个列表,我想在数据库中批量创建条目。
如果不循环遍历列表,我怎么能这样做,我认为,这将取消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之前可以修改列表。
答案 0 :(得分:21)
bulk_create
在一次调用中将对象列表作为单个arg。您在示例中所做的与循环和执行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]
答案 1 :(得分: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)
答案 2 :(得分: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])