In this chapter, we will expand the capabilities of the RESTful API that we started in the previous chapter. We will change the ORM settings to work with a more powerful PostgreSQL database and we will take advantage of the advanced features included in Django REST Framework that allow us to reduce the boilerplate code for complex APIs, such as class-based views. We will:
HTTP
methodThe GameSerializer
class declares many attributes with the same names that we used in the Game
model and repeats information, such as the types and the max_length
values. The GameSerializer
class is a subclass of rest_framework.serializers.Serializer
, it declares attributes that we manually mapped to the appropriate types and overrides the create
and update
methods.
Now, we will create a new version of the GameSerializer
class that will inherit from the rest_framework.serializers.ModelSerializer
class. The ModelSerializer
class automatically populates both set of default fields and a set of default validators. In addition, the class provides default implementations for the create
and update
methods.
Now, go to the gamesapi/games
folder and open the serializers.py
file. Replace the code in this file with the following code, that declares the new version of the GameSerializer
class. The code file for the sample is included in the restful_python_chapter_02_01
folder:
from rest_framework import serializers from games.models import Game class GameSerializer(serializers.ModelSerializer): class Meta: model = Game fields = ('id', 'name', 'release_date', 'game_category', 'played')
The new GameSerializer
class declares a Meta
inner class that declares two attributes: model
and fields
. The model
attribute specifies the model related to the serializer, that is, the Game
class. The fields
attribute specifies a tuple of string whose values indicate the field names that we want to include in the serialization from the related model.
There is no need to override either create
or update
methods because the generic behavior will be enough in this case. The ModelSerializer
superclass provides implementations for both methods.
We have reduced the boilerplate code that we didn't require in the GameSerializer
class. We just needed to specify the desired set of fields in a tuple. Now, the types related to the game fields are included only in the Game
class.
python manage.py runserver
18.188.190.175