From ffcb7881d4abf2e51d4b10304e295f6c261e10b8 Mon Sep 17 00:00:00 2001 From: Roger Thomas Date: Wed, 22 Oct 2014 16:53:45 +0100 Subject: [PATCH] Fix serializer default None field bug --- rest_framework/fields.py | 9 ++++++++- tests/test_serializer.py | 11 +++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index c0253f86b..aa07a6d74 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -354,7 +354,14 @@ class WritableField(Field): else: native = data[field_name] except KeyError: - if self.default is not None and not self.partial: + try: + allow_none = self.allow_none + except AttributeError: + allow_none = False + if ( + (self.default is None and allow_none) or + (self.default is not None) + ) and not self.partial: # Note: partial updates shouldn't set defaults native = self.get_default_value() else: diff --git a/tests/test_serializer.py b/tests/test_serializer.py index 90f37cf2e..2b7bbffd4 100644 --- a/tests/test_serializer.py +++ b/tests/test_serializer.py @@ -913,6 +913,8 @@ class ReadOnlyManyToManyTests(TestCase): class DefaultValueTests(TestCase): def setUp(self): class DefaultValueSerializer(serializers.ModelSerializer): + default_none_field = serializers.CharField(default=None, required=False, allow_none=True) + class Meta: model = DefaultValueModel @@ -928,6 +930,15 @@ class DefaultValueTests(TestCase): self.assertEqual(instance.pk, 1) self.assertEqual(instance.text, 'foobar') + def test_create_using_none_as_default(self): + data = {} + serializer = self.serializer_class(data=data) + self.assertEqual(serializer.is_valid(), True) + instance = serializer.save() + self.assertEqual(len(self.objects.all()), 1) + self.assertEqual(instance.pk, 1) + self.assertEqual(instance.default_none_field, None) + def test_create_overriding_default(self): data = {'text': 'overridden'} serializer = self.serializer_class(data=data)