diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 6caae9242..e0ac72c40 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -1038,3 +1038,17 @@ class SerializerMethodField(Field): def field_to_native(self, obj, field_name): value = getattr(self.parent, self.method_name)(obj) return self.to_native(value) + + +class SerializerLambdaField(Field): + """ + A field that gets its value by calling a lambda. + """ + + def __init__(self, func, *args, **kwargs): + self.func = func + super(SerializerLambdaField, self).__init__(*args, **kwargs) + + def field_to_native(self, obj, field_name): + value = self.func(obj) + return self.to_native(value) \ No newline at end of file diff --git a/rest_framework/tests/test_fields.py b/rest_framework/tests/test_fields.py index b04b947f2..12247dae9 100644 --- a/rest_framework/tests/test_fields.py +++ b/rest_framework/tests/test_fields.py @@ -1002,3 +1002,16 @@ class BooleanField(TestCase): bool_field = serializers.BooleanField(required=True) self.assertFalse(BooleanRequiredSerializer(data={}).is_valid()) + + +class SerializerLambdaFieldTest(TestCase): + """ + Tests for the SerializerLambdaField field_to_native() behavior + """ + class Example(): + my_test = 'Hey, this is a test !' + + def test_field_to_native(self): + s = serializers.SerializerLambdaField(lambda obj: obj.my_test) + result = s.field_to_native(self.Example(), None) + self.assertEqual(result, 'Hey, this is a test !')