序列化器:驗(yàn)證

官方文檔原文

字段級驗(yàn)證

你可以通過向 Serializer 子類添加 .validate_<field_name> 方法來指定自定義字段級驗(yàn)證瘸羡。這些與 Django 的 form 上的 .clean_<field_name> 方法類似遮婶。

這些方法只有一個參數(shù)剥险,就是需要驗(yàn)證的字段值季二。

您的 validate_<field_name> 方法應(yīng)返回驗(yàn)證值或引發(fā) serializers.ValidationError猜煮。

例子:

from rest_framework import serializers

class BlogPostSerializer(serializers.Serializer):
    title = serializers.CharField(max_length=100)
    content = serializers.CharField()

    def validate_title(self, value):
        """
        檢查 title 字段 是否含有 "Django" 單詞.
        """
        if 'django' not in value.lower():
            raise serializers.ValidationError("Blog post is not about Django")
        return value

在 shell 中測試下:

>>> serializer = BlogPostSerializer(data={'title': 'django', 'content': 'bar'})
>>> serializer.is_valid()
True

>>> serializer = BlogPostSerializer(data={'title': 'foobar', 'content': 'bar'})
>>> serializer.is_valid()
False

>>> serializer.errors
ReturnDict([('title', ['Blog post is not about Django'])])

注意:如果你的序列化程序中聲明的 <field_name> 參數(shù)為 required = False 拗胜,那么如果未包含該字段灵汪,則不會執(zhí)行此驗(yàn)證步驟檀训。




對象級驗(yàn)證

如果要對多個字段進(jìn)行其他的驗(yàn)證,請將一個名為 .validate() 的方法添加到您的 Serializer 子類中享言。這個方法只有一個參數(shù)峻凫,它是一個字段值(field-value)的字典。如果有必要览露,它應(yīng)該引發(fā)一個 ValidationError荧琼,或者只是返回驗(yàn)證的值。

例子:

from rest_framework import serializers

class LoginSerializer(serializers.Serializer):
    username = serializers.CharField(max_length=100)
    password1 = serializers.CharField(max_length=16)
    password2 = serializers.CharField(max_length=16)

    def validate(self, data):
        """
        檢查兩次密碼輸入是否一致
        """
        if data['password1'] != data['password2']:
            raise serializers.ValidationError("兩次密碼輸入不一致")
        return data

在 shell 中測試下:

>>> from myapp.serializer import LoginSerializer
>>> serializer = LoginSerializer(data={'username': 'foobar', 'password1': '12345', 'password2': 'abcde'})

>>> serializer.is_valid()
False

>>> serializer.errors
ReturnDict([('non_field_errors', ['兩次密碼輸入不一致'])])




驗(yàn)證器

序列化器上的各個字段可以包含驗(yàn)證器差牛,方法是在字段實(shí)例上聲明它們命锄,例如:

from rest_framework import serializers

# 自定義驗(yàn)證器
def password_validators(value):
    if len(value) < 6:
        raise serializers.ValidationError('密碼需大于6位')


class LoginSerializer(serializers.Serializer):
    username = serializers.CharField(max_length=100)
    # validators 參數(shù)指定使用哪個驗(yàn)證器
    password1 = serializers.CharField(validators=[password_validators])
    password2 = serializers.CharField(validators=[password_validators])

在 shell 中測試下:

>>> from myapp.serializer import LoginSerializer
>>> serializer = LoginSerializer(data={'username': 'foobar', 'password1': '12345', 'password2': '12345'})

>>> serializer.is_valid()
False

>>> serializer.errors
ReturnDict([('password1', ['密碼需大于6位']), ('password2', ['密碼需大于6位'])])
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市偏化,隨后出現(xiàn)的幾起案子脐恩,更是在濱河造成了極大的恐慌,老刑警劉巖侦讨,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驶冒,死亡現(xiàn)場離奇詭異,居然都是意外死亡韵卤,警方通過查閱死者的電腦和手機(jī)骗污,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沈条,“玉大人需忿,你說我怎么就攤上這事∨睦穑” “怎么了贴谎?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵汞扎,是天一觀的道長季稳。 經(jīng)常有香客問我,道長澈魄,這世上最難降的妖魔是什么景鼠? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上铛漓,老公的妹妹穿的比我還像新娘溯香。我一直安慰自己,他們只是感情好浓恶,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布玫坛。 她就那樣靜靜地躺著,像睡著了一般包晰。 火紅的嫁衣襯著肌膚如雪湿镀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天伐憾,我揣著相機(jī)與錄音勉痴,去河邊找鬼。 笑死树肃,一個胖子當(dāng)著我的面吹牛蒸矛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播胸嘴,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼雏掠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了劣像?” 一聲冷哼從身側(cè)響起磁玉,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎驾讲,沒想到半個月后蚊伞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吮铭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年时迫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谓晌。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡掠拳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纸肉,到底是詐尸還是另有隱情溺欧,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布柏肪,位于F島的核電站姐刁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏烦味。R本人自食惡果不足惜聂使,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧柏靶,春花似錦弃理、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至炬转,卻和暖如春控汉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背返吻。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工姑子, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人测僵。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓街佑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捍靠。 傳聞我的和親對象是個殘疾皇子沐旨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)榨婆,斷路器磁携,智...
    卡卡羅2017閱讀 134,707評論 18 139
  • 1、簡介 Laravel 提供了多種方法來驗(yàn)證應(yīng)用輸入數(shù)據(jù)良风。默認(rèn)情況下谊迄,Laravel 的控制器基類使用Valid...
    伊Summer閱讀 1,528評論 0 3
  • 驗(yàn)證 簡介 Laravel 對驗(yàn)證應(yīng)用的輸入數(shù)據(jù)提供了多中途徑的實(shí)現(xiàn)。默認(rèn)的烟央,Laravel 的基礎(chǔ)控制器類使用了...
    Dearmadman閱讀 10,212評論 5 8
  • 譯自《Editing Models and Validation》 編輯模型和驗(yàn)證 作為開發(fā)人員,TornadoF...
    公子小水閱讀 1,864評論 0 3
  • Serializers 序列化器允許將諸如查詢集和模型實(shí)例之類的復(fù)雜數(shù)據(jù)轉(zhuǎn)換為原生 Python 數(shù)據(jù)類型钞艇,然后可...
    lkning閱讀 1,029評論 0 1