diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 43d339da0..63015861f 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -450,7 +450,11 @@ class BaseSerializer(WritableField): into[(self.source or field_name)] = None else: # Set the serializer object if it exists - obj = get_component(self.parent.object, self.source or field_name) if self.parent.object else None + try: + obj = get_component(self.parent.object, self.source or field_name) if self.parent.object else None + except: + # this can happen when updating a 1-to-1 field + obj = None # If we have a model manager or similar object then we need # to iterate through each instance. diff --git a/rest_framework/tests/test_serializer_nested.py b/rest_framework/tests/test_serializer_nested.py index 6d69ffbd0..97cc40ea1 100644 --- a/rest_framework/tests/test_serializer_nested.py +++ b/rest_framework/tests/test_serializer_nested.py @@ -345,3 +345,30 @@ class NestedModelSerializerUpdateTests(TestCase): result = deserialize.object result.save() self.assertEqual(result.id, john.id) + + +class OneToOneNestedSerializerUpdateTests(TestCase): + def test_set_one_to_one_field(self): + + class NullableOneToOneSourceSerializer(serializers.ModelSerializer): + class Meta: + model = models.NullableOneToOneSource + + class OneToOneTargetSerializer(serializers.ModelSerializer): + class Meta: + model = models.OneToOneTarget + + nullable_source = NullableOneToOneSourceSerializer() + + + target = models.OneToOneTarget.objects.create(name='foo') + data = { + 'name': 'Discovery', + 'nullable_source': {'name': 'Daft Punk'}, + } + + # create + serializer = OneToOneTargetSerializer(data=data, instance=target) + self.assertEqual(serializer.is_valid(), True) + target = serializer.save() + self.assertEqual(target.nullable_source.name, 'Daft Punk')