あなたはDjangoのatomic transactionsを探しています。その後、コピーを作成するために、モデルインスタンスusing pk=None
をコピーします。
from django.db import IntegrityError, transaction
def save(self, commit=False):
model1 = super(YourForm, self).save(commit=False)
try:
with transaction.atomic():
model1.save()
model1.pk = None
model1.save() # Saves the second instance, you can loop this.
except IntegrityError:
handle_exception()
return model1
編集を - スピードがあなたの問題であるならば、あなたはそのようbulk_create
を使用することができます。
def save(self, commit=False):
number_of_objects = range(10) # How many objects you want to save
n = 0
model1 = super(YourForm, self).save(commit=False)
objs = [
YourModel(
attribute1=model1.attribute1,
attribute2=model1.attribute2
)
for obj in number_of_objects
]
YourModel.objects.bulk_create(objs)
興味深い - アトミックトランザクションを行うの背後にある考え方は何ですか?エラーがあれば保存されていないことを確認するだけですか? – bodger
また、このようにすれば、すべての新しいオブジェクトが同じ外部キーを共有するため、一方の外部キーを変更すると、そのすべてが反映されます。 フォームから同じ基準を使用して、それぞれに新しいオブジェクトを生成したいとします。 – bodger
@bodger 'transaction.atomic'は、多くの場合ではなくDBを1回呼び出すようになっています。オプションです。 1つの外部キーを変更すると、すべての外部キーが変更されることはありません。適切なモデルのクエリセットで['update'](https://docs.djangoproject.com/en/1.9/topics/db/queries/#updating-multiple-objects-at-once)を使用する必要がありますそのインスタンス。 – YPCrumble