Creating and Using Serializers – Django REST Framework

In Django REST Framework the very concept of Serializing is to convert DB data to a datatype that can be used by javascript. Serializers allow complex data such as querysets and model instances to be converted to native Python datatypes that can then be easily rendered into JSON, XML or other content types. Serializers also provide deserialization, allowing parsed data to be converted back into complex types, after first validating the incoming data. The serializers in REST framework work very similarly to Django’s Form and ModelForm classes.

To check how to setup Django RESt Framework and create a API visit – How to Create a basic API using Django Rest Framework ?

Creating a basic Serializer

To create a basic serializer one needs to import serializers class from rest_framework and define fields for a serializer just like creating a form or model in Django.
Example



filter_none

edit
close

play_arrow

link
brightness_4
code

# import serializer from rest_framework
from rest_framework import serializers
  
# create a serializer
class CommentSerializer(serializers.Serializer):
    # intialize fields
    email = serializers.EmailField()
    content = serializers.CharField(max_length = 200)
    created = serializers.DateTimeField()

chevron_right


This way one can declare serializer for any particular entity or object based on fields required. Serializers can be used to serialize as well as deserialize the data.

Using Serializer to serialize data

One can now use CommentSerializer to serialize a comment, or list of comments. Again, using the Serializer class looks a lot like using a Form class. Let’s create a Comment class first to create a object of type comment that can be understood by our serializer.

filter_none

edit
close

play_arrow

link
brightness_4
code

# import datetime object
from datetime import datetime
  
# create a class
class Comment(object):
    def __init__(self, email, content, created = None):
        self.email = email
        self.content = content
        self.created = created or datetime.now()
# create a object
comment = Comment(email ='leila@example.com', content ='foo bar')

chevron_right


Now that our object is ready, let’s try serializing this comment object. Run following command,

Python manage.py shell

Now run the following code

# import comment serializer
>>> from apis.serializers import CommentSerializer

# import datetime for date and time
>>> from datetime import datetime

# create a object
>>> class Comment(object):
...     def __init__(self, email, content, created=None):
...         self.email = email
...         self.content = content
...         self.created = created or datetime.now()
... 

# create a comment object
>>> comment = Comment(email='leila@example.com', content='foo bar')

# serialize the data
>>> serializer = CommentSerializer(comment)

# print serialized data
>>> serializer.data

Now let’s check ouutput for this,
creating-a-serializer

We can convert this data to JSON or XML format using Python’s inbuilt functions or rest framework’s parsers.

filter_none

edit
close

play_arrow

link
brightness_4
code

# import JSON Renderer
from rest_framework.renderers import JSONRenderer
  
# convert data to JSON
json = JSONRenderer().render(serializer.data)

chevron_right


Using Serializer to deserialize data

Deserialization is similar to Serialization. It means to convert the data from JSON format to a given data type. First we parse a stream into Python native datatypes… (define which datatype to deserialize to….)
Fist we need to convert this json data back to data that can be understood by serializer for deserializing,

filter_none

edit
close

play_arrow

link
brightness_4
code

import io
from rest_framework.parsers import JSONParser
  
stream = io.BytesIO(json)
data = JSONParser().parse(stream)

chevron_right


and Now let’s deserialize the data back to its original state

filter_none

edit
close

play_arrow

link
brightness_4
code

serializer = CommentSerializer(data = data)
serializer.is_valid()
# True
serializer.validated_data

chevron_right


Let’s check output and if data has been deserialized –
deserializing-rest-framework




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.