2016-06-27 6 views
1

ユーザがDjangoで1つのフォームを完成した結果、複数の同一オブジェクトを作成する最善の方法は何ですか?Djangoフォームから複数の同一オブジェクトを作成する

ループでform.save()を呼び出すと(フォームやその他の設定で設定された番号に基づいて)、同じIDを持つインスタンスが複数回だけ作成されます。

私が実際にやろうとしているのは、毎日/週/ユーザの指定した日付の範囲に基づいて(現時点ではdjango-recurrenceを使用して)同じインスタンスの読み込みを作成することです。

アイデア?

答えて

0

あなたは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) 
+0

興味深い - アトミックトランザクションを行うの背後にある考え方は何ですか?エラーがあれば保存されていないことを確認するだけですか? – bodger

+0

また、このようにすれば、すべての新しいオブジェクトが同じ外部キーを共有するため、一方の外部キーを変更すると、そのすべてが反映されます。 フォームから同じ基準を使用して、それぞれに新しいオブジェクトを生成したいとします。 – bodger

+0

@bodger 'transaction.atomic'は、多くの場合ではなくDBを1回呼び出すようになっています。オプションです。 1つの外部キーを変更すると、すべての外部キーが変更されることはありません。適切なモデルのクエリセットで['update'](https://docs.djangoproject.com/en/1.9/topics/db/queries/#updating-multiple-objects-at-once)を使用する必要がありますそのインスタンス。 – YPCrumble

関連する問題