2012-12-12 34 views
0

期間分配模型的研究類字段的值,我可以做到這一點:Django的:實例

counter = 0 

class A(models.Model): 
    code = models.IntegerField(max_length=30, default=generate_code) 

def generate_code(): 
    counter += 1 
    return counter 

但它似乎是,該分配模型類的初始化(加載)期間進行,而不是在創建一個實例,所以'code'總是'1'。

如何在創建模型類的實例時自動爲某個字段分配動態值?

如果我設置在被覆蓋的__init__函數值,就像這樣:

class A(models.Model): 

    def __init__(self, *args, **kwargs): 
     models.Model.__init__(self, *args, **kwargs) 
     self.code = self.generate_code() 

的代碼變化對每一次更新。正如調試器顯示的那樣,當我刪除對象時,__init__函數也被調用。我真的不明白這一點!

我只能在__init__函數中設置代碼,如果它沒有設置,但似乎是不合邏輯的,所以我喜歡避免它。

回答

1

您是否正在尋找一種方法來確保數據庫中的每個A對象都具有唯一的計數器值?然後你可以使用AutoField代替IntegerFieldhttps://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.AutoField

當你創建一個新的A對象,其counter值將被自動設置爲一個高於先前創建的一個。

爲了解釋你所看到的一些行爲,每次加載models.py時,它都會確實將一個新的counter變量初始化爲0,正如你想象的那樣。至於爲什麼A構造函數在你不期望的時候被調用,A只是一個代表數據庫中某些數據的類。所以每次Django從數據庫中獲取數據並將其呈現給您時,它都會創建一個新的A對象來封裝該數據。

+0

好的,這聽起來邏輯上關於'__init__'。我想,我已經找到了我的問題的解決方案:我必須重寫'save'函數並設置'code',如果它尚未設置。 'AutoField'不適合我的問題,因爲我需要一個隨機值而不是遞增值。 (對不起,我簡化了我的例子太多了。) – t777