Serializers allow complex data like querysets and model instances to be converted to native Python datatypes that can then be easily rendered into JSON, XML, and other formats.
Suppose we wanted to create a PostSerializer for our example Post model and CommentSerializer for our Comment model.
class PostSerializer(serializers.ModelSerializer): class Meta: model = Post fields = ('id', 'title', 'text', 'created') class CommentSerializer(serializers.ModelSerializer): class Meta: model = Comment fields = ('post', 'user', 'text')
Or also you could use
exclude to exclude certain fields from being seialized. ModelSerializer has default implementations for the
By default, instances are serialized with primary keys to represent relationships. To get nested serialization we could use, General or Explicit methods.
class CommentSerializer(serializers.ModelSerializer): class Meta: model = Comment fields = '__all__' depth = 2
Yuo can also define and nest serializers within eachother…
class CommentSerializer(serializers.ModelSerializer): post = PostSerializer() class Meta: model = Comment fields = '__all__'
So here, the comment’s
post field (how we named it in models.py) will serialize however we defined it in
This makes your web API a lot more easy to use (in browser) and would be a nice feature to add.
Let’s say we wanted to see the comments that every post has in each of the Post instances of our API.
HyperlinkedModelSerializer, instead of having nested primary keys or nested fields, we get a link to each individual Comment (URL).
class PostSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Post fields = ('id', 'title', 'text', 'created', 'comments') read_only_fields = ('comments',)
Note: without the
create form for Posts would always require a
comments input, which doesn’t make sense (comments on a post are normally made AFTER the post is created).
Another way of hyperlinking is just adding a
HyperlinkedRelatedField definition to a normal serializer.
class PostSerializer(serializers.ModelSerializer): comments = serializers.HyperlinkedRelatedField(many=True, view_name='comment-detail', read_only=True) class Meta: model = Post fields = ('id', 'title', 'text', 'created', 'comments')
This makes your web API a lot more easy for extract limited number of parameter in response. Let’s say you want to set which fields should be used by a serializer at the point of initialization.
Just copy below code and past it in your serliazer file
class DynamicFieldsModelSerializer(serializers.ModelSerializer): def __init__(self, *args, **kwargs): # Don't pass the 'fields' arg up to the superclass fields = kwargs.pop('fields', None) # Instantiate the superclass normally super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs) if fields is not None: # Drop any fields that are not specified in the `fields` argument. allowed = set(fields) existing = set(self.fields.keys()) for field_name in existing - allowed: self.fields.pop(field_name)
DynamicFieldsModelSerializer from your serializer class
class UserSerializer(DynamicFieldsModelSerializer): class Meta: model = User fields = ('id', 'username', 'email')
Mention the fields name inside
UserSerializer(user, fields=('id', 'email'))
Here, you will get only