2

我意識到這已被問過,但我沒能找到一個真正處理我想要做的事情的問題。我認爲這很簡單,但我想知道一般人認爲這是最好的形式。Django模型覆蓋保存/使用信號/或使用模型?

比方說,我們有以下幾點:

models.py

class TestClass(models.Model): 
    user = models.ForeignKey(User) 
    testfield = models.CharField() 
    testbool = models.BooleanField(default=False) 

def save(self, *args, **kwargs): 
    """ 
    - what we're trying to do here is ensure that the User doesn't have more than 
     X (lets say 5) related test fields. 
    - what if we also wanted to add validation to testfield to ensure it was 
     only [a-zA-Z]? 
    """ 
    if TestClass.objects.filter(user=self.user).count() >= 5: 
     # How do we exit gracefully? 
     return 
    super(TestClass, self).save(*args, **kwargs) 

中保存功能非常總結一下我的問題的意見: - 我們將如何確保有沒有更多的5個相關TestClass的給予用戶 - 如果已經有5 - 如何從保存中退出(不保存) - 我們如何向用戶報告此問題? - 我們在哪裏驗證testfield對象以確保它只有[a-z]?我是否可以導入re,並在此處執行此操作? 應該我?

最好把這一切扔在這裏嗎?我應該發射pre_save信號嗎?或者我應該只使用ModelForm w /驗證?

回答

0

你說得對,目前沒有明顯的地方可以做到這一點。這就是爲什麼現在有一個Summer of Code項目正在進行,以添加模型級別的驗證,這應該使這種事情變得更加簡單。

不幸的是它不會準備好幾個月。與此同時,您的答案取決於數據的添加方式。它是否會以編程方式完成,還是始終通過表單?如果是後者,那麼將驗證放入表單是一種可行的方式(請注意,您可以在管理員和自己的視圖中使用相同的模型或其子類,因此不需要重複邏輯)。

+0

如果我在管理員中使用它,它是否會覆蓋管理員所做的標準驗證(aka blank = False,正確的日期等)? 另外;如果我想重寫save(),那麼最好的退出方式是什麼?我假設引發一個異常可能是不好的......所以我只是返回False而沒有給出理由? – lostincode 2009-06-05 09:21:10

+0

只要你不重新定義任何實際字段,那麼默認驗證將正常工作。爲了節省,它不需要返回任何東西,所以只需返回就可以了。 – 2009-06-05 09:59:10