美文网首页
序列化器:验证

序列化器:验证

作者: SingleDiego | 来源:发表于2018-04-28 16:07 被阅读145次

官方文档原文

字段级验证

你可以通过向 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位'])])

相关文章

  • Djangorestframework的反序列化

    一 数据验证 后端接收数据,使用序列化器进行反序列化时,需要对数据进行验证后,才能获取验证成功的数据,再保存为模型...

  • DRF使用篇(四):反序列化

    验证过程 使用序列化器进行反序列化时,需要对数据进行验证后,才能获取验证成功的数据或保存成模型类对象 在获取反序列...

  • Django-->反序列化的操作

    1. 验证 使用序列化器进行反序列化时,需要对数据进行验证后,才能获取验证成功的数据或保存成模型类对象在获取反序列...

  • DRF-序列化

    序列化 序列化有两大功能:请求数据的验证,对queryset的序列化 创建URL 编写视图(方法1) 浏览器效果 ...

  • 序列化器:验证

    官方文档原文 字段级验证 你可以通过向 Serializer 子类添加 .validate_

  • Serializer fields - Django REST

    序列化器字段-Django REST框架 fields.py 串行化字段 表单类中的每个字段不仅负责验证数据,而且...

  • kafka编程应用

    Kafka中的分区器、序列化器、拦截器是否了解?它们之间的处理顺序是什么? 序列化器:生产者需要用序列化器(Ser...

  • # Django Rest_Framework(二)序列化器Se

    作用: 1.序列化,序列化器会把模型对象转换成字典,经过response以后变成Json字符串 反序列化,序列化器...

  • 注册短信验证三步走

    1、发送验证码模块 2\验证手机号模块:序列化 3\视图模块

  • DRF-序列化器serializers

    序列化器serializer的介绍: 序列化,序列化器会把模型对象转换成字典,经过response 之后变成jso...

网友评论

      本文标题:序列化器:验证

      本文链接:https://www.haomeiwen.com/subject/vrowlftx.html