2012-04-26 60 views
2

我有與我想要的更新後,總是比同型號實例的前一個更高的領域的Django模型,這樣的檢查前值:如何在一個Django模型

class MyModel(models.Model): 
    version = models.FloatField() 
    prev_value = 0 

    def clean(self): 
     if self.version <= self.prev_value: 
      raise ValidationError('error msg') 

    def save(self,*args,**kwargs): 
     super(MyModel, self).save(*args, **kwargs) 
     self.prev_value = self.version 

我知道乾淨的工作正常,因爲我有相同的方法的其他驗證,它工作得很好,我做錯了什麼,我該如何解決它? 在此先感謝。

我測試了它與其它版本並沒有拋出的更新任何錯誤消息< prev_value

編輯:使用新的Django 1.4

+0

你能解釋一下部分不適合你的工作? – jdi 2012-04-26 18:46:51

回答

4

模型子類IM實際上最終有一個元類格式化他們所有的類屬性。所以你不應該初始化一個普通的值作爲類屬性。你應該這樣做在__init__

class MyModel(models.Model): 
    version = models.FloatField() 

    def __init__(self, *args, **kwargs): 
     super(MyModel, self).__init__(*args, **kwargs) 
     self._prev_value = self.version 

    def clean(self): 
     if self.version <= self._prev_value: 
      raise ValidationError('error msg') 

    def save(self,*args,**kwargs): 
     super(MyModel, self).save(*args, **kwargs) 
     self._prev_value = self.version 
+0

它的工作原理,現在我嘗試了self._prev_value = 0之前嘗試你的版本,它沒有奏效,我不知道什麼叫第一個__init__,乾淨或保存 – loki 2012-04-26 19:15:52

+1

@ user1108631:當你的實例正在創建時調用__init__'數據庫查詢或手動創建一個新的。 Clean在稍後由驗證過程調用。 – jdi 2012-04-26 19:17:36