所以我有一個具有以下屬性的書模型:不允許在模型屬性空字符串
title = models.CharField(max_length=250)
在管理員或模型的形式,這將不允許空字符串保存,因爲空白=假的默認。但在我的情況下,我解析XML並創建模型,所以我根本沒有使用任何形式。
所以我想知道是否有一個約束,我可以設置,不允許空字符串或我必須寫我的模型字段或調整我的分析器?
所以我有一個具有以下屬性的書模型:不允許在模型屬性空字符串
title = models.CharField(max_length=250)
在管理員或模型的形式,這將不允許空字符串保存,因爲空白=假的默認。但在我的情況下,我解析XML並創建模型,所以我根本沒有使用任何形式。
所以我想知道是否有一個約束,我可以設置,不允許空字符串或我必須寫我的模型字段或調整我的分析器?
你仍然可以使用表單驗證數據和創建模型對象,爲的ModelForm返回它創建的對象。我在使用.xls文件對模型進行批量更新時使用了這種方法,並且效果很好。
以這種方式使用表單還可以讓您有機會記錄錯誤信息,啓動其他進程或任何您想要的內容。
它還可以減輕您手動編輯數據庫的難度,並且如果字符串爲空,表單還可以插入默認值。
希望能幫助你。
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
好了,所以這是一個老問題,這是可能的Django的ORM /模型層沒有在這個被問的時候有支持,但對於車型kwarg,blank
這不正是你想要什麼:
class MyModel(models.Model):
text = models.CharField(max_length=255, null=False, blank=False)
我目前正在使用上述功能,效果很好。我必須指出,儘管布蘭登預先驗證輸入的答案是一個好主意,應該用這個db限制來完成。我只是額外的偏執,併爲此(這可能只發生由於程序員錯誤,因爲我有輸入不能提交沒有值)只會發生空白文本值會打破一些事情,使UI完全混淆,所以我不會允許他們!
希望如果有人在將來遇到這個帖子,他們會看到這個。
這是不正確的。 'blank'和'null'默認都是'False',所以這與'title = models.CharField(max_length = 250)'沒有區別。 – YPCrumble
Django模型的缺省值爲blank=False
(適用於表單驗證)和null=False
(這意味着數據庫不能包含NULL
)。如果您不使用表單來實例化模型實例,則這兩種方法都不會阻止將空字符串保存在數據庫中。
一種不使用表單的方法(例如,如果你想使用實例或create
的get_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
。
您仍然可以使用表單來驗證數據並創建模型對象。我在解析.xls文件時使用了這種方法,它工作得很好。使用表單也會給您一個記錄錯誤的機會。 – Brandon
這是一個很好的建議,你應該從中得出答案。 – Pickels
謝謝。我將其添加爲答案。 – Brandon