Serializers
Serializer Function Field
SerializerFunctionField
is very similar to SerializerMethodField
. except
you pass a function instead of a method to the field.
You should use SerializerFunctionField
when you have to include the same
functionality in several serializers.
Example
Let's take a look to example when you need to return whether authenticated user follows the other user.
Here is the comparison of code using method field and function field approaches
from rest_framework import serializers
from drf_dog.serializers import SerializerFunctionField
def get_is_following(obj, context):
return obj.followers.filter(pk=context['request'].user.pk).exists()
class UserSerializer(serializers.ModelSerializer):
is_following = SerializerFunctionField(function=get_is_following)
class Meta:
model = User
fields = ('id', 'username', 'is_following')
from rest_framework import serializers
class UserSerializer(serializers.ModelSerializer):
is_following = serializers.SerializerMethodField()
class Meta:
model = User
fields = ('id', 'username', 'is_following')
def get_is_following(self, obj):
return obj.followers.filter(
pk=self.context['request'].user.pk
).exists()
This is very useful when you have several serializers relying on get_is_following
.
For example,
from rest_framework import serializers
from drf_dog.serializers import SerializerFunctionField
from my_project.utils import get_is_following
class AutocompleteUserSerializer(serializers.ModelSerializer):
is_following = SerializerFunctionField(function=get_is_following)
class Meta:
model = User
fields = ('id', 'username', 'is_following')
class RetrieveUserSerializer(serializers.ModelSerializer):
is_following = SerializerFunctionField(function=get_is_following)
class Meta:
model = User
fields = ('id', 'username', 'email', 'is_active', 'avatar',
'is_following')
So, above is some sort of solution to code duplication .