今天遇到一個問題:
在restframework框架中開發,數據庫了創建了一個model的屬性如下所示:
remarks = models.CharField(verbose_name=u"描述", max_length=500, null=True)
remarks為非必傳數據,所以在serializer中沒有加驗證,當時覺得沒什么問題,但在提交數據時remarks為空字符串,報錯為‘驗證失敗,remarks不能為空’。但當remarks不傳值時則沒有報錯。
后來經過一番查找搜索,發現是沒有加blank=True的原因。
最終經過修改:
remarks = models.CharField(verbose_name=u"描述", max_length=500, null=True, blank = True)
再次提交,即使remark為空字符串,依然能提交成功。
總結如下:
1、serializer中沒有加驗證,所以remarks不傳值時可以通過,切此時默認為null。這是null=True在起作用,null是和數據庫相關的,當reamrks為空時,就會被存儲為NULL。
2、blank = True是頁面表單驗證相關的,表示在頁面當中對應的表單可以為空,可以不填任何內容。
blank
設置為True時,字段可以為空。設置為False時,字段是必須填寫的。字符型字段CharField和TextField是用空字符串來存儲空值的。
如果為True,字段允許為空,默認不允許。
null
設置為True時,django用Null來存儲空值。日期型、時間型和數字型字段不接受空字符串。所以設置IntegerField,DateTimeField型字段可以為空時,需要將blank,null均設為True。
如果為True,空值將會被存儲為NULL,默認為False。
如果想設置BooleanField為空時可以選用NullBooleanField型字段。
一句話概括
- null 是針對數據庫而言,如果 null=True, 表示數據庫的該字段可以為空。
- blank 是針對表單的,如果 blank=True,表示你的表單填寫該字段的時候可以不填,比如 admin 界面下增加 model 一條記錄的時候。直觀的看到就是該字段不是粗體
- 通俗點說,該字段null=true后,你進行插入,修改操作時可以為空,然后Django把空值轉換成null存在數據庫中,而blank只是在表單驗證的時候會檢測你是否可以為空