成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Django的數(shù)據(jù)驗(yàn)證(validating objects)

張漢慶 / 874人閱讀

摘要:在中,對(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ù):

可選參數(shù)exclude可以用來指定不需要執(zhí)行校驗(yàn)的field。ModelForm也利用這個(gè)參數(shù)來將field排除。
參數(shù)validate_unique用來指定是否需要執(zhí)行Model.validate_unique()。

如何檢查校驗(yàn)結(jié)果:

full_clean將會(huì)按序執(zhí)行3個(gè)方法,這3個(gè)方法如果校驗(yàn)失敗的話,會(huì)將相關(guān)信息寫到異常的message_dict屬性中,并且拋出ValidationError異常。

save()執(zhí)行的時(shí)候是不會(huì)自動(dòng)調(diào)用full_clean()來進(jìn)行校驗(yàn)的。

手動(dòng)校驗(yàn)model的合法性:
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
3個(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)->io
Model.clean_fields

Model.clean_fields(exclude=None)
這個(gè)方法將會(huì)校驗(yàn)排除exclude中指定的,model中的所有field。當(dāng)它校驗(yàn)失敗的時(shí)候,會(huì)拋出ValidationError異常。

Model.clean

如果你想要自定義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()

當(dāng)調(diào)用model的save()方法的時(shí)候,是不會(huì)調(diào)用Model.clean來進(jìn)行校驗(yàn)的

校驗(yàn)中的錯(cuò)誤處理

在上面的例子中,我們使用了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

相關(guān)文章

  • 10-django——RESTful API 之序列化

    摘要:之序列化前后端分離就是前臺(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ā)人員提...

    Bowman_han 評(píng)論0 收藏0
  • Python學(xué)習(xí)之路18-用戶賬戶

    摘要:通過的定制字段的輸入小部件,將文本框的寬度設(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è)身份...

    bovenson 評(píng)論0 收藏0
  • Django 學(xué)習(xí)小組:博客開發(fā)實(shí)戰(zhàn)第五周教程 —— 實(shí)現(xiàn)評(píng)論功能

    摘要:本教程內(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...

    CoderStudy 評(píng)論0 收藏0
  • Django 學(xué)習(xí)小組:博客開發(fā)實(shí)戰(zhàn)第五周教程 —— 實(shí)現(xiàn)評(píng)論功能

    摘要:本教程內(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...

    kumfo 評(píng)論0 收藏0
  • Django REST FrameWork中文教程3:基于類視圖

    摘要:看起來不錯(cuò)再次,它現(xiàn)在仍然非常類似于基于功能的視圖。我們還需要重構(gòu)一下我們使用基于類的視圖。中文文檔目錄中文教程序列化中文教程請(qǐng)求和響應(yīng)中文教程基于類的視圖中文教程驗(yàn)證和權(quán)限中文教程關(guān)系和超鏈接中文教程中文教程模式和客戶端庫 我們也可以使用基于類的視圖編寫我們的API視圖,而不是基于函數(shù)的視圖。我們將看到這是一個(gè)強(qiáng)大的模式,允許我們重用常用功能,并幫助我們保持代碼DRY。 使用基于類的...

    UnixAgain 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<