diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 5ee2536d2..9a58d966f 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -957,7 +957,7 @@ class ModelSerializer(Serializer): # Raise an error if we span more than one relation if len(keys) > 2: - self._errors[key] = 'Can not span more than a relation' + self._errors[key] = 'Can not span more than a relation.' continue # Mark the related instance as the one to save diff --git a/rest_framework/tests/test_serializer.py b/rest_framework/tests/test_serializer.py index 7a95c6510..7edf7ea96 100644 --- a/rest_framework/tests/test_serializer.py +++ b/rest_framework/tests/test_serializer.py @@ -1889,3 +1889,19 @@ class RelationSpanningSerializerTest(TestCase): serializer = TicketSerializer(ticket, data={'username': 'doe'}) self.assertFalse(serializer.is_valid()) self.assertEqual(serializer.errors, {'username': 'Related object does not exist.'}) + + def test_multiple_model_traversal_update(self): + """Update a field through a foreign key during an update.""" + class TicketSerializer(serializers.ModelSerializer): + username = fields.CharField(source='assigned.demo.name') + + class Meta: + model = Ticket + fields = ('username',) + + owner = Person.objects.create(name='john') + reviewer = Person.objects.create(name='reviewer') + ticket = Ticket.objects.create(assigned=owner, reviewer=reviewer) + serializer = TicketSerializer(ticket, data={'username': 'doe'}) + self.assertFalse(serializer.is_valid()) + self.assertEqual(serializer.errors, {'username': 'Can not span more than a relation.'})