小王寫的程序又雙出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 If True, the field is allowed to be blank. Default is False.Note that this is different than null. null is purely database-related, whereas blank is validation-related. 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.

是的,沒錯呀,默認情況下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情況的出現呢?

  1. 首先在前端進行數據校驗,儘早提示用戶輸入必填數據,可以省去後端的工作量
  2. 為了確保數據的可靠性,後端作為最後一道防護門檻,建議使用django forms,這樣forms在進行數據校驗時會自動去models里查看相關自動的屬性設置,例如欄位長度,是否為空等

Django forms功能非常強大,相比自己勞神費力取數據、驗證數據,Django forms可能一個函數就搞定了,而且代碼看起來更簡潔明了。

另外一個極力推薦的庫便是django-rest-framework了,viewsets搭配mixins,簡直爽到爆

Home - Django REST framework?

www.django-rest-framework.org圖標
推薦閱讀:

相关文章