diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 49eec8259..a80fc7996 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -216,8 +216,11 @@ class BaseSerializer(Field): ) if not hasattr(self, '_validated_data'): + validation_data = self.to_representation(self.instance) if self.instance else {} + validation_data.update(self.initial_data) + try: - self._validated_data = self.run_validation(self.initial_data) + self._validated_data = self.run_validation(validation_data) except ValidationError as exc: self._validated_data = {} self._errors = exc.detail diff --git a/tests/test_model_serializer.py b/tests/test_model_serializer.py index 7da1b41ae..38a9f36cc 100644 --- a/tests/test_model_serializer.py +++ b/tests/test_model_serializer.py @@ -1333,3 +1333,27 @@ class Issue6751Test(TestCase): serializer.save() self.assertEqual(instance.char_field, 'value changed by signal') + + +class Issue7489Model(models.Model): + field1 = models.CharField(max_length=1) + field2 = models.CharField(max_length=1) + field3 = models.CharField(max_length=1) + + class Meta: + unique_together = ('field1', 'field2') + + +class Issue7489Serializer(serializers.ModelSerializer): + class Meta: + model = Issue7489Model + fields = '__all__' + + +class Issue7489Test(TestCase): + def test_model_serializer_substitutes_default_on_unique_together_validation(self): + Issue7489Model.objects.create(field1='A', field2='A') + b = Issue7489Model.objects.create(field1='B', field2='B') + # Attempt to validate the serializer for updating `field3` on instance `b` + serializer = Issue7489Serializer(instance=b, data={'field3': 'X'}) + self.assertTrue(serializer.is_valid(), serializer.errors) \ No newline at end of file