Django:你是不是對我的blank有什麼誤解
小王寫的程序又雙出bug了!
事情的經過是這樣的:小王調用Django orm進行數據保存時,居然成功將空值寫入了一個必填欄位,於是錯誤捕捉失敗,導致資料庫中出現了不符合預期要求的數據。
models文件如下
# models.py
from django.db import models
class Students(models.Model):
no = models.CharField(學號, max_length=5)
name = models.CharField(姓名, max_length=30)
email = models.EmailField(郵箱)
視圖文件如下
# views.py
from django.views import View
from django.http import JsonResponse
from .models import StudentsModel
class StudentView(View):
def post(self, request):
no = request.POST.get(no)
name = request.POST.get(name)
email = request.POST.get(email)
try:
StudentsModel.objects.create(
no=no,
name=name,
email=email
)
data = {msg: create data success}
return JsonResponse(data=data, status=200)
except Exception as e:
data = {msg: str(e)}
return JsonResponse(data=data, status=500)
模擬發送請求,此時no值為空,發現居然保存成功了!?並沒有任何報錯提示
小王百思不得其解,於是重新翻看了下Django的官方文檔:
blank
Field.blank
IfTrue
, the field is allowed to be blank. Default isFalse
.Note that this is different thannull
.null
is purely database-related, whereasblank
is validation-related. If a field hasblank=True
, form validation will allow entry of an empty value. If a field hasblank=False
, the field will be required.
是的,沒錯呀,默認情況下blank=False,那麼保存空值時一定會提示的,小王甚至特意在models.py裏將blank屬性進行了設置:
no = models.CharField(學號, max_length=5, blank=False)
然後並沒有什麼卵用,難道文檔也會騙人?
事實上,blank並不會對Django orm的save、update方法起作用,blank只在admin, django forms進行數據校驗時才生效。所以文檔其實講的很清楚,這裡的form纔是重點
If a field has blank=True, form validation will allow entry of an empty value. If a field has blank=False, the field will be required.
那怎麼防止小王這種bug情況的出現呢?
- 首先在前端進行數據校驗,儘早提示用戶輸入必填數據,可以省去後端的工作量
- 為了確保數據的可靠性,後端作為最後一道防護門檻,建議使用django forms,這樣forms在進行數據校驗時會自動去models裏查看相關自動的屬性設置,例如欄位長度,是否為空等
Django forms功能非常強大,相比自己勞神費力取數據、驗證數據,Django forms可能一個函數就搞定了,而且代碼看起來更簡潔明瞭。
另外一個極力推薦的庫便是django-rest-framework了,viewsets搭配mixins,簡直爽到爆
Home - Django REST framework
推薦閱讀: