Wednesday, June 10, 2020

Django REST framework Serialization:

Django REST framework Serialization:

Django REST Framework serializers convert the model instances into python dictionaries, which can then be rendered in various API appropriate formats : JSON, XML …

To work with API first we have to create models

Create models:

In your project models.py module create models. For example…

from django.db import models
import uuid


class Genre(models.Model):
    book_kind = models.CharField(
max_length=200)


class Book(models.Model):  
   
title = models.CharField(max_length=200)
    author = models.ForeignKey('Author', on_delete=models.SET_NULL)
    summary = models.TextField(
max_length=1000)
    isbn = models.CharField(
max_length=13)
    genre = models.ManyToManyField(Genre)
    language = models.ForeignKey('Language', on_delete=models.SET_NULL)

class BookInstance(models.Model):
    id = models.UUIDField(
primary_key=True, default=uuid.uuid4)
    book = models.ForeignKey(
'Book', on_delete=models.SET_NULL)
    imprint = models.CharField(
max_length=200)
    due_back = models.DateField(
null=True, blank=True)
    LOAN_STATUS = (
        (
'm', 'Maintenance'),
       
('o', 'On loan'),
       
('a', 'Available'),
       
('r', 'Reserved'),
   
)
    status = models.CharField(
       
max_length=1,
       
choices=LOAN_STATUS,
       
blank=True,
       
default='m',
       
help_text='Book availability',
   
)


class Author(models.Model):
    first_name = models.CharField(
max_length=100)
    last_name = models.CharField(
max_length=100)
    date_of_birth = models.DateField(
null=True, blank=True)
    date_of_death = models.DateField(
'Died', null=True, blank=True)


class Language(models.Model): 
   
lang_name = models.CharField(max_length=200)

Create serializer class using ModelSerializer:

Create serializer classes in project serializers.py module as follows:

First import serializers module and models

from rest_framework import serializers
from catalogapp.models import Book, Author, Genre, Language

 

How to serialize ManyToManyField relation:

In the above models, Book and Genre has many-to-many relationship.

First create GenreSerializer and then modify the BookSerializer by adding many=True in ManyToManyField relation as follows..


class GenreSerializer(serializers.ModelSerializer):
   
class Meta:
        model = Genre
        fields = [
'book_kind']

 


class BookSerializer(serializers.ModelSerializer):
    genre = GenreSerializer(
read_only=True, many=True)

   
class Meta:
        model = Book
        fields = [
'title','genre']

 

How to serialize Foreignkey relation:

 

In the above models, Book and Author & Book and Language has many-to-one relationship.

First create AuthorSerializer & LanguageSerializer and then modify the BookSerializer by adding many=True in Foreignkey relation as follows..


class AuthorSerializer(serializers.ModelSerializer):
   
class Meta:
        model = Author
        fields = [
'first_name', 'last_name', 'date_of_birth', 'date_of_death']


class LanguageSerializer(serializers.ModelSerializer):
   
class Meta:
        model = Language
        fields = [
'lang_name']

 

class BookSerializer(serializers.ModelSerializer):
    genre = GenreSerializer(
read_only=True, many=True)
    author = AuthorSerializer(
many=True)
    language = LanguageSerializer(
many=True)

   
class Meta:
        model = Book
        fields = [
'title', 'author', 'summary', 'isbn', 'genre', 'language']

Now you can inspect all the fields in serializer instance by printing its representation.

Open shell by giving the command python manage.py shell

Then try the following..

>>> from catalogapp.serializers import BookSerializer, AuthorSerializer, GenreSerializer, LanguageSerializer

>>> serializer = BookSerializer()

>>> print(repr(serializer))

BookSerializer():

…………………

After that write Django views using serializers

And then map views and urls in urls.py module

Now start up Django development server python manage.py runserver

We can test our API by installing httpie using pip

pip install httpie

C:\Users\>http  http://127.0.0.1:8000/catalogapp/

HTTP/1.1 200 OK

Content-Length: 1665

……………………


No comments:

Post a Comment