2011-07-25 77 views
2

所以我有一個具有以下屬性的書模型:不允許在模型屬性空字符串

title = models.CharField(max_length=250) 

在管理員或模型的形式,這將不允許空字符串保存,因爲空白=假的默認。但在我的情況下,我解析XML並創建模型,所以我根本沒有使用任何形式。

所以我想知道是否有一個約束,我可以設置,不允許空字符串或我必須寫我的模型字段或調整我的分析器?

+3

您仍然可以使用表單來驗證數據並創建模型對象。我在解析.xls文件時使用了這種方法,它工作得很好。使用表單也會給您一個記錄錯誤的機會。 – Brandon

+0

這是一個很好的建議,你應該從中得出答案。 – Pickels

+0

謝謝。我將其添加爲答案。 – Brandon

回答

6

你仍然可以使用表單驗證數據和創建模型對象,爲的ModelForm返回它創建的對象。我在使用.xls文件對模型進行批量更新時使用了這種方法,並且效果很好。

以這種方式使用表單還可以讓您有機會記錄錯誤信息,啓動其他進程或任何您想要的內容。

它還可以減輕您手動編輯數據庫的難度,並且如果字符串爲空,表單還可以插入默認值。

希望能幫助你。

1

MySQL對約束的支持有限,因此您必須使用觸發器(see here for more about how to use trigger s)或調整解析器。

假設你沒有NULL作爲字段值,你可以設置你的模型字段爲null=False(null純粹是數據庫相關的,而空白是驗證相關的)並且調整你的解析器來設置任何變量這是空字符串無:

if not variable: 
    variable = None 

此之前的SO問題,也可能會有所幫助: I'm looking for a constraint to prevent the insert of an empty string in MySQL

-1

好了,所以這是一個老問題,這是可能的Django的ORM /模型層沒有在這個被問的時候有支持,但對於車型kwarg,blank這不正是你想要什麼:

class MyModel(models.Model): 
    text = models.CharField(max_length=255, null=False, blank=False) 

我目前正在使用上述功能,效果很好。我必須指出,儘管布蘭登預先驗證輸入的答案是一個好主意,應該用這個db限制來完成。我只是額外的偏執,併爲此(這可能只發生由於程序員錯誤,因爲我有輸入不能提交沒有值)只會發生空白文本值會打破一些事情,使UI完全混淆,所以我不會允許他們!

希望如果有人在將來遇到這個帖子,他們會看到這個。

+1

這是不正確的。 'blank'和'null'默認都是'False',所以這與'title = models.CharField(max_length = 250)'沒有區別。 – YPCrumble

2

Django模型的缺省值爲blank=False(適用於表單驗證)和null=False(這意味着數據庫不能包含NULL)。如果您不使用表單來實例化模型實例,則這兩種方法都不會阻止將空字符串保存在數據庫中。

一種不使用表單的方法(例如,如果你想使用實例或createget_or_create類)是override the model's clean method and call full_clean in the save method

from django.core.exceptions import ValidationError 

    def clean(self): 
     if self.title == "": 
      raise ValidationError("Database should not contain an empty string title!") 

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

你的情況,你很可能把你的驗證到save功能以及。覆蓋clean方法並在保存方法中調用full_clean的優點是ValidationError將被添加到表單的non_field_errors

相關問題