字段級驗(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位'])])