1
由於用戶在Django中完成單個窗體的結果而創建多個相同的對象的最佳方式是什麼?從Django的形式創建多個相同的對象
如果我在一個循環中調用form.save()(基於一個設置的數字,或者由表單或其他設置),它只會多次創建一個具有相同ID的實例。
我實際上試圖做的是創建一個相同的實例負載,每天/每週/無論基於用戶指定的日期範圍(此刻使用django-recurrence)。
任何想法?
由於用戶在Django中完成單個窗體的結果而創建多個相同的對象的最佳方式是什麼?從Django的形式創建多個相同的對象
如果我在一個循環中調用form.save()(基於一個設置的數字,或者由表單或其他設置),它只會多次創建一個具有相同ID的實例。
我實際上試圖做的是創建一個相同的實例負載,每天/每週/無論基於用戶指定的日期範圍(此刻使用django-recurrence)。
任何想法?
您正在尋找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'使您可以對數據庫進行一次調用而不是多次調用。這是可選的。 如果你改變一個外鍵,它將不會改變所有的外鍵。您必須在相應模型的查詢集上使用['update'](https://docs.djangoproject.com/en/1.9/topics/db/queries/#updating-multiple-objects-at-once)實例。 – YPCrumble