2016-06-27 97 views
1

由於用戶在Django中完成單個窗體的結果而創建多個相同的對象的最佳方式是什麼?從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'使您可以對數據庫進行一次調用而不是多次調用。這是可選的。 如果你改變一個外鍵,它將不會改變所有的外鍵。您必須在相應模型的查詢集上使用['update'](https://docs.djangoproject.com/en/1.9/topics/db/queries/#updating-multiple-objects-at-once)實例。 – YPCrumble

相關問題