11

私は Django bulk_create とその「欠陥」のいくつかを読んでいました:

"
This has a number of caveats though:

1. The model's save() method will not be called, and the pre_save and post_save signals will not be sent.
2. It does not work with child models in a multi-table inheritance scenario.
3. If the model's primary key is an AutoField it does not retrieve and set the primary key attribute, as save() does.
"

私はそれを完全には理解していませんでした。オブジェクトのリストがある場合は、それを bulk_create に渡します。

objList = [a, b, c,] #none are saved
model.objects.bulk_create(objList)

これらのオブジェクトを外部キーで引き続き使用できますか?

for obj in objList:
    o = otherModel(something='asdfasdf', fkey=obj)
    o.save() # will this be fine given the caveats stated above?

では、foreignKey 関係は大丈夫でしょうか? また、2. マルチテーブル継承シナリオでは子モデルでは機能しません。これは、別のモデル (抽象的であるかどうかに関係なく) から継承するモデルは、bulk_create を使用できないことを意味します。

4

2 に答える 2

6

IDを手動で設定してみてください。競合状態を防ぐために、関数を単一のトランザクションとしてラップするようにしてください。

from django.db import transaction, models

@transaction.commit_on_success
def bulk_create_with_manual_ids(foo_list):
    id_start = (Foo.objects.all().aggregate(models.Max('id'))['id__max'] or 0) + 1
    for i,foo in enumerate(foo_list): foo.id = id_start + i
    return Foo.objects.bulk_create(foo_list)

objList = [Foo(),Foo(),Foo()]
foo_objects = bulk_create_with_manual_ids(objList)
Bar(foo=foo_objects[0]).save()

このアプローチは、serialフィールドまたはその他の自動インクリメントのデータベース内生成キーを持つテーブルには不適切であることに注意してください。IDはDjango側で生成されているため、キーは一括作成によってインクリメントされません。

于 2012-10-30T16:04:11.737 に答える
3

最初の質問についてはobj、主キーが設定されていないため、外部キーとして使用できないため、それを行うことはできません。

2 番目の質問、いいえ、それはまったく言っていないことです。具体的には「マルチテーブル継承」について言及しています。抽象モデルからの継承は、マルチテーブル継承ではありません。

于 2012-05-29T12:14:25.657 に答える