13

データベースにエントリを一括作成したいリストがあります。

リストをループせずにこれを行うにはどうすればよいでしょうか。

例えば:

それ以外の...

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_create1回の呼び出しで、オブジェクトのリストを1つの引数として受け取ります。あなたの例であなたがしていることは、ループしてやっているのと同じでしょう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すでにインスタンス化されており、1つのクエリで一括作成する必要があるオブジェクトのリストを指します。たとえば、保存されていないインスタンスのリストがまだなく、値のリストがある場合は、次のようなリストを作成できます。

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 のポイントは、作成するデータベースの数に関係なく、データベースを 1 回だけヒットすることです。それが効率的であると私たちが考える理由です。

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']

単純に1行:

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