3. Validation

Add validation to fields defined in the serializer class.

3.1. Defining our deserailizer class with validators

Lets consider a similar example that we used in deserialization example. Lets assume we have a comment object and the comment object has a user attached to it, Now lets define a deserializer class with validators:

from pyserializer.serializers import Serializer
from pyserializer import fields
from pyserializer import validators

class UserDeserializer(Serializer):
    email = fields.CharField(
        validators=[
            validators.RequiredValidator(),
            validators.EmailValidator()
        ]
    )
    username = fields.CharField()
    age = fields.IntegerField(
        validators=[validators.MaxValueValidator(max_value=90)]
    )

    class Meta:
        fields = (
            'email',
            'username',
            'age',
        )

    def __repr__(self):
        return '<User(%r)>' % (self.username)

class CommentDeserializer(Serializer):
    user = UserDeserializer()
    content = fields.CharField(
        validators=[validators.MaxLengthValidator(max_length=3)]
    )
    rating = fields.IntegerField(
        validators=[validators.MinValueValidator(min_value=0)]
    )

    class Meta:
        fields = (
            'user',
            'content',
            'rating',
        )

    def __repr__(self):
        return '<Comment(%r)>' % (self.content)

3.2. Validate the object

Lets use the deserializer class we defined above to validate the data dict and deserialize a Python dict:

data_dict = {
    'user': {
        'username': 'JohnSmith',
        'age': 100
    },
    'content': 'foo bar',
    'rating': -2
}
deserializer = CommentDeserializer(data_dict=data_dict)
deserializer.is_valid()
# False
deserializer.errors
# OrderedDict([('email', [OrderedDict([('type_name', 'RequiredValidator'), ('type_label', 'required'), ('message', 'Value is required.')]), OrderedDict([('type_name', 'EmailValidator'), ('type_label', 'email'), ('message', 'None is an invalid email address.')])]), ('age', [OrderedDict([('type_name', 'MaxValueValidator'), ('type_label', 'max_value'), ('message', 'Ensure this value is less than or equal to 90.')])]), ('content', [OrderedDict([('type_name', 'MaxLengthValidator'), ('type_label', 'max_length'), ('message', 'Ensure the value has atmost 3 characters(it has 7 characters).')])]), ('rating', [OrderedDict([('type_name', 'MinValueValidator'), ('type_label', 'max_value'), ('message', 'Ensure this value is greater than or equal to 0.')])])])