2013-01-18 37 views
0

我剛剛發現用Django F()表達式分配的字段無法驗證。我修改例如,從the Django doc是否有可能使用Django F()表達式與full_clean()一起進行原子更新?

>>> product = Product.objects.get(name='Venezuelan Beaver Cheese') 
>>> product.number_sold = F('number_sold') + 1 
>>> product.full_clean() # My addition. 
>>> product.save() 

而且我越來越:ValidationError: {'number_sold': [u"'(+: (DEFAULT:), 0)' value must be an integer."]}。事實上,銷售的數量不是一個整數,而是一個django.db.models.expressions.ExpressionNode的實例。

有沒有辦法解決這個問題?我所有的模型都擴展了一個基類,每次保存時自動調用full_clean(),我真的很想保留這個基類,但能夠使用原子更新。

+0

我認爲你需要從django源代碼中提取full_clean並編寫你自己的實現,它假定ExpressionNode的值總是有效的。 –

回答

-1

您的問題是,您正在嘗試在整數字段中保存非整數值。

字段number_sold在您的情況下預計爲整數。

我會假設F('number_sold')引用一個空字段。

嘗試的東西硬編碼如1

更換F('number_sold') + 1如果這項工作,讓我知道,我能提供的邏輯,以避免您的錯誤。

+0

我不認爲是這樣。 number_sold是一個models.IntegerField(默認= 0)。此外,如果我刪除full_clean(),save()該值並重新讀取對象,則number_sold會正確增加(變爲1)。 –

相關問題