2013-03-31 35 views
22

我想在模型上執行一些自定義驗證,我感到困惑。讓我具體一點。比方說,我的代碼如下:調用django中的create時隱式調用save()嗎?

class FooManager(models.Manager): 
    def create_foo(self, name): 
    return self.create(foo_name = name) 

class Foo(models.Model): 
    foo_name = models.CharField(max_length=30) 
    objects = FooManager() 

    def clean(self): 
    ... 
    def save(self, *args, **kwargs): 
    self.full_clean() 
    super(User, self).save(*args, **kwargs) 

現在,當我從殼這種模式工作,如果我叫:

F = Foo.objects.create_foo( 「」)

這將引發驗證錯誤之前,我得到一個機會ŧ o在f上調用save()。爲什麼會發生?一旦我調用f.save(),不應該只會提高驗證錯誤嗎?

注意:如果我使用objects.create()而不是自定義的create方法,則會發生同樣的情況。任何幫助將不勝感激,因爲我在django中發現驗證相當令人沮喪。

回答

0

你忘了self在經理

class FooManager(models.Manager): 
    def create_foo(self, name): 
     return self.create(foo_name = name) 
+0

不,對不起,這是我這個不好的例子的錯。在我的實際代碼中,我確實把自己放在經理身上。我應該提出自己的實際代碼,這有幫助嗎? – innospark

16

create()會自動保存,所以即使你改正錯誤 - 你仍然必須確保參數創建滿足數據庫要求保存記錄。

+0

爲什麼創建自動保存?在文檔中說明如下: 「請注意,實例化模型不會觸及數據庫;爲此,您需要保存()。」那麼如果create()會自動保存,那麼調用save()的意義是什麼? – innospark

+2

這就是整個問題,你不需要調用'save()',因爲'create()'是一個創建實例的快捷方式,然後自動保存。 –

+0

哦,完美。我只是在文檔中找到了它的位置,我想我會盡力閱讀!非常感謝,你爲我節省了不少時間Burhan! – innospark

相關問題