摘要:在中,對數(shù)據(jù)進行校驗有兩種方式一種是通過中校驗,一種是通過校驗。所有內(nèi)容都是基于的官網(wǎng)文檔整理而來數(shù)據(jù)校驗的觸發(fā)中的校驗是通過調(diào)用方法來執(zhí)行的。注意值得注意的是上面多次提到,在執(zhí)行方法的時候,是不會進行數(shù)據(jù)校驗的。
在Django中,對數(shù)據(jù)進行校驗有兩種方式:一種是通過Form中校驗,一種是通過Model校驗。在次,我對Model中的校驗方法做下記錄。
所有內(nèi)容都是基于Django1.10的官網(wǎng)文檔整理而來
validating objects 數(shù)據(jù)校驗的觸發(fā):Model中的校驗是通過調(diào)用Model.full_clean()方法來執(zhí)行的。包括在Form中也會對objects進行校驗,也是通過調(diào)用Model.full_clean()的方式來進行的。但是,通常的情況下我們并不需要自己調(diào)用Model.full_clean()方法。
什么時候需要調(diào)用full_clean()當你使用ModelForm的時候,Model.full_clean()將會在你調(diào)用is_valid()方法的時候?qū)?strong>ModelForm中所有的field進行校驗。只有當你想要自己特別的處理校驗的報錯信息,或者是想要校驗在ModelForm中沒有包含的field時才需要來自己調(diào)用full_clean()這個方法。
Model.full_clean說明Model.full_clean(exclude=None, validate_unique=True)
在Model.full_clean()內(nèi)部其實是會通過3個方法來進行不同層次的校驗,對于這3個方法在后面會講到。
可選參數(shù)exclude可以用來指定不需要執(zhí)行校驗的field。ModelForm也利用這個參數(shù)來將field排除。
參數(shù)validate_unique用來指定是否需要執(zhí)行Model.validate_unique()。
full_clean將會按序執(zhí)行3個方法,這3個方法如果校驗失敗的話,會將相關信息寫到異常的message_dict屬性中,并且拋出ValidationError異常。
手動校驗model的合法性:save()執(zhí)行的時候是不會自動調(diào)用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. pass3個校驗方法:
校驗model fields - Model.clean_fields()
校驗整個model - Model.clean()
校驗field的唯一性 - Model.validate_unique()
這幾個步驟將會在調(diào)用model的full_clean()方法時執(zhí)行,流程如下:
st=>start: Model.full_clean e=>end: return io=>inputoutput: rais ValidationError sub1=>subroutine: Model.clean_fields cond1=>condition: valid sub2=>subroutine: Model.clean cond2=>condition: valid sub3=>subroutine: Model.validate_unique cond3=>condition: valid st->sub1->cond1(yes)->sub2->cond2(yes)->sub3->cond3(yes)->e st->sub1->cond1(no)->io st->sub1->cond1(yes)->sub2->cond2(no)->io st->sub1->cond1(yes)->sub2->cond2(yes)->sub3->cond3(no)->ioModel.clean_fields
Model.clean_fields(exclude=None)
這個方法將會校驗排除exclude中指定的,model中的所有field。當它校驗失敗的時候,會拋出ValidationError異常。
如果你想要自定義model的校驗,或者想要修改model的屬性的話,就override這個方法。例如,你可以使用它來為field自動提供一個值:
import datetime from django.core.exceptions import ValidationError from django.db import models from django.utils.translation import ugettext_lazy as _ 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()
校驗中的錯誤處理當調(diào)用model的save()方法的時候,是不會調(diào)用Model.clean來進行校驗的
在上面的例子中,我們使用了ValidationError來在Model.clean中拋出錯誤,這個錯誤信息將會存儲在以NON_FIELD_ERRORS為key的字典中。這個key是用來存儲對于整個model中的錯誤信息的。
如何獲取校驗的錯誤信息:
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]
如何指定對于某個特定的field的校驗錯誤信息:
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.")}) ...
如何指定多個field的校驗錯誤信息:
raise ValidationError({ "title": ValidationError(_("Missing title."), code="required"), "pub_date": ValidationError(_("Invalid date."), code="invalid"), })Model.validate_unique說明
Model.validate_unique(exclude=None)
最后,full_clean()將會檢查model中的unique的限制。它在校驗失敗的時候會拋出ValidationError異常。
值得注意的是:上面多次提到,在執(zhí)行save()方法的時候,是不會進行數(shù)據(jù)校驗的。校驗應該在save()執(zhí)行之前完成,你可以先在form進行校驗,也可以在model中進行校驗。但是,你必須確保通過這兩個校驗之后的數(shù)據(jù)是絕對沒有問題的“干凈”數(shù)據(jù),然后再調(diào)用save()方法將數(shù)據(jù)存儲入庫。
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://hztianpu.com/yun/38170.html
摘要:之序列化前后端分離就是前臺的開發(fā)和后臺的開發(fā)分離,這個技術方案的實現(xiàn)需要借助,簡單來說就是開發(fā)人員提供編程的接口被其他人調(diào)用,調(diào)用之后會返回數(shù)據(jù)供其使用安裝什么是序列化把模型對象轉(zhuǎn)換為格式然后響應出去,便于客戶端進行數(shù)據(jù)解析創(chuàng)建序列化類在應 Django RESTful API之序列化 前后端分離:就是前臺的開發(fā)和后臺的開發(fā)分離,這個技術方案的實現(xiàn)需要借助API,簡單來說就是開發(fā)人員提...
摘要:通過的定制字段的輸入小部件,將文本框的寬度設置為列,而不是默認的列。為此將創(chuàng)建一個新的應用程序,其中包含處理用戶賬戶相關的所有功能。該函數(shù)將會為通過了身份驗證的用戶對象創(chuàng)建會話。 《Python編程:從入門到實踐》筆記。本篇記錄如何創(chuàng)建用戶注冊系統(tǒng),如何實現(xiàn)用戶輸入自己的數(shù)據(jù)。 1. 前言 在本篇中,我們將: 創(chuàng)建一些表單,讓用戶能夠添加主題和條目,以及編輯既有的條目; 實現(xiàn)一個身份...
摘要:本教程內(nèi)容已過時,更新版教程請訪問博客開發(fā)入門教程。我們的評論表單放在中,評論成功后返回到原始提交頁面。學習小組簡介學習小組是一個促進新手互相學習互相幫助的組織。 本教程內(nèi)容已過時,更新版教程請訪問: django 博客開發(fā)入門教程。 通過前四周的時間我們開發(fā)了一個簡單的個人 Blog,前幾期教程地址: 第一周:Django 學習小組:博客開發(fā)實戰(zhàn)第一周教程 —— 編寫博客的 Mode...
摘要:本教程內(nèi)容已過時,更新版教程請訪問博客開發(fā)入門教程。我們的評論表單放在中,評論成功后返回到原始提交頁面。學習小組簡介學習小組是一個促進新手互相學習互相幫助的組織。 本教程內(nèi)容已過時,更新版教程請訪問: django 博客開發(fā)入門教程。 通過前四周的時間我們開發(fā)了一個簡單的個人 Blog,前幾期教程地址: 第一周:Django 學習小組:博客開發(fā)實戰(zhàn)第一周教程 —— 編寫博客的 Mode...
摘要:看起來不錯再次,它現(xiàn)在仍然非常類似于基于功能的視圖。我們還需要重構一下我們使用基于類的視圖。中文文檔目錄中文教程序列化中文教程請求和響應中文教程基于類的視圖中文教程驗證和權限中文教程關系和超鏈接中文教程中文教程模式和客戶端庫 我們也可以使用基于類的視圖編寫我們的API視圖,而不是基于函數(shù)的視圖。我們將看到這是一個強大的模式,允許我們重用常用功能,并幫助我們保持代碼DRY。 使用基于類的...
閱讀 1034·2021-11-16 11:56
閱讀 1836·2021-11-16 11:45
閱讀 3361·2021-10-08 10:13
閱讀 4302·2021-09-22 15:27
閱讀 880·2019-08-30 11:03
閱讀 784·2019-08-30 10:56
閱讀 1090·2019-08-29 15:18
閱讀 1876·2019-08-29 14:05