2012-04-16 40 views
1

我試圖創建一個可調用對象,以在創建新實例時返回用於字段的默認值。爲Field.default創建一個Django可調用對象

該值的邏輯取決於模型中的其他數據。我嘗試創建一個單獨的課程,但沒有找到正確的因素組合。例如:

在models.py

Class Box(models.Model): 
    inv_id = models.CharField(max_length=16,default=gen_inv_id()) 

的調用對象將需要查詢的數據庫模型和增量的表值。我嘗試在應用程序下的單獨.py模塊中創建一個類,但它需要一個方法來返回值。在這一點上,OO並不是我的強項。我認爲這個模型已經失效了,並且這個方法依賴於它,所以它似乎已經出現了雞/雞蛋的情景。

感謝您的任何幫助。

回答

0

我以前碰到過這個。你可以做的一件事就是覆蓋類的save方法,這樣你就可以先保存進行計算所需的參數,然後進行計算並重新保存。如果你覆蓋保存方法,你需要調用super.save()(我忘記了確切的符號是什麼)

編輯:super.save的記號是超級(Model,self).save( * args,** kwargs)

5

由於永遠(在1.0天之前)默認關鍵字支持可調用。你的代碼的問題是你沒有傳遞一個可調用的(default=gen_inv_id),但是可調用的結果(default=gen_inv_id())。

所以,你可能想要做:

Class Box(models.Model): 
    inv_id = models.CharField(max_length=16,default=gen_inv_id) 

退房的文檔爲最新版本的描述是: https://docs.djangoproject.com/en/1.4/ref/models/fields/#default

+0

一些其他意見提重寫'save'方法,同時,做工作,它比這更混亂。但是,如果您的默認值需要訪問對象實例(例如,如果您的默認值基於該模型中的某個其他字段),則您將希望覆蓋'save'方法。 – 2012-04-16 22:29:41

+0

這是一個很好的答案。 需要注意的一件事是,運行遷移時引入了具有缺省值的字段,並且表中存在行。在這種情況下,'default'函數只運行一次,並且所有行都會填充相同的值(與實例單獨保存的情況不同)。 要解決: 1.設置字段爲可爲空沒有缺省, 2.運行數據遷移來填充現有的行, 3.設置默認並設置字段不可爲空。 – Geekfish 2016-11-21 12:45:19