Model Serializer vs Dynamic Fields Model Serializer in DRF

The Django REST Framework (DRF) uses the serializers ModelSerializer and DynamicFieldsModelSerializer to serialize and deserialize Django model instances.

ModelSerializer is a serializer that creates fields on the fly using the model's defined fields. Using many of the same settings as the standard serializer fields, it offers a set of default fields that match to the model fields. Also, based on the model's fields, it provides default implementations for the create() and update() methods. It is helpful in straightforward situations where you wish to create a serializer automatically from a model.

DynamicFieldsModelSerializer, on the other hand, is a serializer that enables the client to select the fields they want to include or exclude in the serialized output. Passing will accomplish this.

Example of Model Serializer:

from rest_framework import serializers
from .models import Book

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'

In this illustration, we develop a BookSerializer that creates fields based on the Book model automatically. We employ the ModelSerializer class, which generates fields for all of the model's fields automatically.

Example of Dynamic Fields Model Serializer:

from rest_framework import serializers
from .models import Book

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book

    def __init__(self, *args, **kwargs):
        fields = kwargs.pop('fields', None)
        exclude = kwargs.pop('exclude', None)

        super(BookSerializer, self).__init__(*args, **kwargs)

        if fields is not None:
            allowed = set(fields)
            existing = set(self.fields.keys())
            for field_name in existing - allowed:
                self.fields.pop(field_name)

        if exclude is not None:
            not_allowed = set(exclude)
            for field_name in not_allowed:
                self.fields.pop(field_name)

Here, we construct a BookSerializer that lets the client select the fields they wish to include or exclude in the output that has been serialized. In order to dynamically build the serializer fields based on the fields or exclude argument, we override the init() method.

For instance, we can build a BookSerializer instance using the fields parameter if we just want to include the title and author fields in the serialized output:

serializer = BookSerializer(queryset, many=True, fields=('title', 'author'))

Only the title and author fields will be present in the serialized output in this case. Instead, we might use the exclude option to exclude the published date field:

serializer = BookSerializer(queryset, many=True, exclude=('published_date',))

The published date column will not be included in the serialized output in this case.