2014-05-22 134 views
6

併發操作的Django形式integrityerror我注意到,我不知道這是否是一個真正的問題還是我做一些錯誤的設計的事。的獨特領域

我有一個模型:

class A(Model): 
    name = CharField(unique=True, max_length=255) 

並且鏈接到一個的ModelForm,這的ModelForm有clean_name()方法,即檢查該字段是在DB唯一的(忽視的事實是modelforms已經做默認情況下,我在這裏指定這個例子)。

在如果我做

o = form.save(commit=False) 
# xyz 
o.save() 

#xyz我有另一個客戶端,插入用相同name字段值的目的,o.save()觸發Integrityerror例外,正確地防止重複記錄的視圖將被插入。

我想知道的是如何處理這些情況,我是否應該使用try/except塊來包裝o.save(),然後在表單上填充錯誤字段以指定選擇另一個name值?

這在某種程度上應該發生在每個人,一個常見的情況和解決方案是可怕的,所以我覺得我做的事情可怕的錯誤。

+0

爲什麼你不只是做:O = form.save()?這樣下一個條目將不會通過表單驗證。 – cchristelis

+0

@cchristelis在這種情況下#xyz會在form.is_valid()和form.save()之間。 – DRC

+0

一種解決方法是先保存對象(如果某些必填字段在'xyz'計算使用虛擬值),並有一個名爲'calculating'一個布爾值字段,你設置爲TRUE;當你正在做'xyz'。當額外的工作完成後,您可以根據'xyz'的結果更新/刪除它,並將'calculate'設置爲False。儘管你的建議和我的建議都很駭人,但我們希望別人能提出一個更好的方法。 –

回答

0

我懷疑這可能是這種情況:

模型的形式提供,只有當一個標誌xx_clean()設定唯一性驗證。如果您用自己的(如您所用)覆蓋clean,則需要調用超類的clean()。見overwriting the clean method