I have a lot of similar fields that should be created in a similar way.
from rest_framework import serializers
class UserSerializer(serializers.ModelSerializer):
is_friend = serializers.SerializerMethodField('get_is_friend')
# ...
def get_is_friend(self, obj):
user = self.context['request'].user
return user.id in obj.friend_list
# ...
class Meta:
fields = (
'is_friend',
# ...
)
Currently I have a decorator, it makes all I need, except creating SerializerMethodField.
def additional_fields_decorator(cls):
relation_methods = (
{
'name': 'is_friend',
'field_name': 'friends',
},
# ...
)
def relation_method_factory(field_name):
def wrapper(self, obj):
user = self.context['request'].user
return user.id in getattr(obj, field_name)
return wrapper
for method in relation_methods:
name = method['name']
name_getter = 'get_{0}'.format(name)
setattr(cls, name_getter, relation_method_factory(method['field_name']))
cls.Meta.fields += (name,)
# following line fails
setattr(cls, name, serializers.SerializerMethodField(name_getter))
return cls
@additional_fields_decorator
class UserSerializer(serializers.ModelSerializer):
pass
Who knows why SerializerMethodField cannot be created outside of the Serializer class?