Django框架model模型對象驗證實現方法分析

 更新時間:2019年10月02日 11:52:07   作者:菲宇   我要評論
這篇文章主要介紹了Django框架model模型對象驗證實現方法,結合實例形式分析了Django框架model模型對象驗證相關原理、實現步驟及操作注意事項,需要的朋友可以參考下

本文實例講述了Django框架model模型對象驗證實現方法。分享給大家供大家參考,具體如下:

模型對象的驗證

驗證一個模型涉及三個步驟:

  • 驗證模型的字段 —— Model.clean_fields()
  • 驗證模型的完整性 —— Model.clean()
  • 驗證模型的唯一性 —— Model.validate_unique()

當調用模型的full_clean() 方法時,這三個方法都將執行。當使用ModelForm時,is_valid() 將為表單中的所有字段執行這些驗證。如果你計劃自己處理驗證出現的錯誤,或者你已經將需要驗證的字段從ModelForm 中去除掉,你只需調用模型的full_clean() 方法。

Model.full_clean(exclude=None, validate_unique=True)

該方法按順序調用Model.clean_fields()、Model.clean() 和Model.validate_unique()(如果validate_unique 為True),并引發一個ValidationError,該異常的message_dict 屬性包含三個步驟的所有錯誤。可選的exclude 參數用來提供一個可以從驗證和清除中排除的字段名稱的列表。ModelForm 使用這個參數來排除表單中沒有出現的字段,使它們不需要驗證,因為用戶無法修正這些字段的錯誤。注意,當你調用模型的save() 方法時,full_clean() 不會 自動調用。如果你想一步就可以為你手工創建的模型運行驗證,你需要手工調用它。例如:

from django.core.exceptions import ValidationError
try:
  article.full_clean()
except ValidationError as e:
  # Do something based on the errors contained in e.message_dict.
  # Display them to a user, or handle them programmatically.
  pass

full_clean() 第一步執行的是驗證每個字段。

Model.clean_fields(exclude=None)

這個方法將驗證模型的所有字段。可選的exclude 參數讓你提供一個字段名稱列表來從驗證中排除。如果有字段驗證失敗,它將引發一個ValidationError。

full_clean() 第二步執行的是調用Model.clean()。如要實現模型自定義的驗證,應該覆蓋這個方法。

Model.clean()

應該用這個方法來提供自定義的模型驗證,以及修改模型的屬性。例如,你可以使用它來給一個字段自動提供值,或者用于多個字段需要一起驗證的情形:

import datetime
from django.core.exceptions import ValidationError
from django.db import models
class Article(models.Model):
  ...
  def clean(self):
    # Don't allow draft entries to have a pub_date.
    if self.status == 'draft' and self.pub_date is not None:
      raise ValidationError('Draft entries may not have a publication date.')
    # Set the pub_date for published items if it hasn't been set already.
    if self.status == 'published' and self.pub_date is None:
      self.pub_date = datetime.date.today()

Model.full_clean() 類似,調用模型的save() 方法時不會引起clean() 方法的調用。

在上面的示例中,Model.clean() 引發的ValidationError 異常通過一個字符串實例化,所以它將被保存在一個特殊的錯誤字典鍵NON_FIELD_ERRORS中。這個鍵用于整個模型出現的錯誤而不是一個特定字段出現的錯誤:

from django.core.exceptions import ValidationError, NON_FIELD_ERRORS
try:
  article.full_clean()
except ValidationError as e:
  non_field_errors = e.message_dict[NON_FIELD_ERRORS]

若要引發一個特定字段的異常,可以使用一個字典實例化ValidationError,其中字典的鍵為字段的名稱。我們可以更新前面的例子,只引發pub_date 字段上的異常:

class Article(models.Model):
  ...
  def clean(self):
    # Don't allow draft entries to have a pub_date.
    if self.status == 'draft' and self.pub_date is not None:
      raise ValidationError({'pub_date': 'Draft entries may not have a publication date.'})
    ...

最后,full_clean() 將檢查模型的唯一性約束。

Model.validate_unique(exclude=None)

該方法與clean_fields() 類似,只是驗證的是模型的所有唯一性約束而不是單個字段的值。可選的exclude 參數允許你提供一個字段名稱的列表來從驗證中排除。如果有字段驗證失敗,將引發一個 ValidationError。

注意,如果你提供一個exclude 參數給validate_unique(),任何涉及到其中一個字段的unique_together 約束將不檢查。

希望本文所述對大家基于Django框架的Python程序設計有所幫助。

相關文章

  • 利用pandas讀取中文數據集的方法

    利用pandas讀取中文數據集的方法

    今天小編就為大家分享一篇利用pandas讀取中文數據集的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Django 權限認證(根據不同的用戶,設置不同的顯示和訪問權限)

    Django 權限認證(根據不同的用戶,設置不同的顯示和訪問權限)

    這篇文章主要介紹了Django 權限認證(根據不同的用戶,設置不同的顯示和訪問權限),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-07-07
  • 淺談Python中eval的強大與危害

    淺談Python中eval的強大與危害

    這篇文章主要介紹了Python中eval的強大與危害,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • 在python下讀取并展示raw格式的圖片實例

    在python下讀取并展示raw格式的圖片實例

    今天小編就為大家分享一篇在python下讀取并展示raw格式的圖片實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python3幾個常見問題的處理方法

    Python3幾個常見問題的處理方法

    今天小編就為大家分享一篇關于Python3幾個常見問題的處理方法,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • Django視圖和URL配置詳解

    Django視圖和URL配置詳解

    這篇文章主要介紹了Django視圖和URL配置詳解,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • python進階教程之循環相關函數range、enumerate、zip

    python進階教程之循環相關函數range、enumerate、zip

    這篇文章主要介紹了python進階教程之循環相關函數range、enumerate、zip,在使用循環程序經常要配合這些函數來完成循環,需要的朋友可以參考下
    2014-08-08
  • python處理兩種分隔符的數據集方法

    python處理兩種分隔符的數據集方法

    今天小編就為大家分享一篇python處理兩種分隔符的數據集方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • 解決Python requests庫編碼 socks5代理的問題

    解決Python requests庫編碼 socks5代理的問題

    今天小編就為大家分享一篇解決Python requests庫編碼 socks5代理的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Python Flask-web表單使用詳解

    Python Flask-web表單使用詳解

    這篇文章主要為大家詳細介紹了Python Flask-web表單的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11

最新評論

润升娱乐