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