您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關怎么在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框架中實現model模型對象驗證就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。