Django REST supports both serializers and model serializers. Serializers provides basic validation for fields, In some cases we need to write custom validations for fields .
Let's take an example for validation for serializer fields.
Case: A company want's recruit for the position of "django developer". Company set age restriction on applicant that his/her age should be greater than twenty and less than thirty years.
from datetime import date from rest_framework import serializers def age_restriction(dob): today = date.today() age = today.year - dob.year - ((today.month, today.day) < (dob.month, dob.day)) if (not(20 < age < 30)): raise serializers.ValidationError("You are no eligible for the job") return dob class EligibilitySerializer(serializers.Serializer): email = serializers.EmailField() name = serializers.CharField(max_length=200) date_of_birth = serializers.DateField(validators=[age_restriction])
"serializers.Serializer" apply primary validations on the field when we call method "is_valid". Serializer converts the value of the field into python object. After it checks for the attribute "validate_<field_name>" if it has the attribute it will the attribute(method). After this validation it will check for "validators" attribute for the field. validators is list object. so, serializer takes the each validator from the validatiors list and applies it on the field value. After it will call method "validate" and executes validations init.
"validate_<field_name>" recieves field related value but, where as "validate" method recieves the all fields related data and raises "non field errors"
If any one of the validations[above mentioned validation methods] are failed then validation error will be raised otherwise the valid value will be returned.
from datetime import date from rest_framework import serializers class EligibilitySerializer(serializers.Serializer): email = serializers.EmailField() name = serializers.CharField(max_length=200) date_of_birth = serializers.DateField() def validate_date_of_birth(self, dob): today = date.today() age = today.year - dob.year - ((today.month, today.day) < (dob.month, dob.day)) if (not(20 < age < 30)): raise serializers.ValidationError("You are no eligible for the job") return dob
Test the above serializer with valid data and invalid data
# testing with valid data data = { 'date_of_birth': '1993-04-08', 'email': 'hello@micropyramid.com', 'name': 'Micropyramid' } s = EligibilitySerializer(data=data) print(s.is_valid()) # Output: True print(s.data) # Output: ReturnDict([('email', 'hello@micropyramid.com'), # ('name', 'Micropyramid'), # ('date_of_birth', '1993-14-08')]) # testing with invalid data data = { 'date_of_birth': '1980-04-08', 'email': 'hello@micropyramid.com', 'name': 'Micropyramid' } print(s.is_valid()) # Output: False print(s.errors) # Output: ReturnDict([('date_of_birth', ['You are no eligible for the job'])])
when to use "validate_<field_name>" and "validators" for fields ?
To Know more about our Django CRM(Customer Relationship Management) Open Source Package. Check Code
Micropyramid is a software development and cloud consulting partner for enterprise businesses across the world. We work on python, Django, Salesforce, Angular, Reactjs, React Native, MySQL, PostgreSQL, Docker, Linux, Ansible, git, amazon web services. We are Amazon and salesforce consulting partner with 5 years of cloud architect experience. We develop e-commerce, retail, banking, machine learning, CMS, CRM web and mobile applications.
Django-CRM :Customer relationship management based on Django
Django-blog-it : django blog with complete customization and ready to use with one click installer Edit
Django-webpacker : A django compressor tool
Django-MFA : Multi Factor Authentication
Docker-box : Web Interface to manage full blown docker containers and images
More...