序列化器:验证

官方文档原文

字段级验证

你可以通过向 Serializer 子类添加 .validate_<field_name> 方法来指定自定义字段级验证。这些与 Django 的 form 上的 .clean_<field_name> 方法类似。

这些方法只有一个参数,就是需要验证的字段值。

您的 validate_<field_name> 方法应返回验证值或引发 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> 参数为 required = False ,那么如果未包含该字段,则不会执行此验证步骤。




对象级验证

如果要对多个字段进行其他的验证,请将一个名为 .validate() 的方法添加到您的 Serializer 子类中。这个方法只有一个参数,它是一个字段值(field-value)的字典。如果有必要,它应该引发一个 ValidationError,或者只是返回验证的值。

例子:

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', ['两次密码输入不一致'])])




验证器

序列化器上的各个字段可以包含验证器,方法是在字段实例上声明它们,例如:

from rest_framework import serializers

# 自定义验证器
def password_validators(value):
    if len(value) < 6:
        raise serializers.ValidationError('密码需大于6位')


class LoginSerializer(serializers.Serializer):
    username = serializers.CharField(max_length=100)
    # validators 参数指定使用哪个验证器
    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位'])])
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,087评论 19 139
  • 1、简介 Laravel 提供了多种方法来验证应用输入数据。默认情况下,Laravel 的控制器基类使用Valid...
    伊Summer阅读 1,561评论 0 3
  • 验证 简介 Laravel 对验证应用的输入数据提供了多中途径的实现。默认的,Laravel 的基础控制器类使用了...
    Dearmadman阅读 10,252评论 5 8
  • 译自《Editing Models and Validation》 编辑模型和验证 作为开发人员,TornadoF...
    公子小水阅读 1,923评论 0 3
  • Serializers 序列化器允许将诸如查询集和模型实例之类的复杂数据转换为原生 Python 数据类型,然后可...
    lkning阅读 1,078评论 0 1