Include serialized model data when validating

When an instance is passed to a ModelSerializer, we might need fields 
that aren't specified in initial_data to run a validator. Specifically 
for UniqueTogether
This commit is contained in:
John Parton 2021-05-21 14:02:00 -05:00
parent 3875d3284e
commit 11621ad5f7
2 changed files with 28 additions and 1 deletions

View File

@ -216,8 +216,11 @@ class BaseSerializer(Field):
) )
if not hasattr(self, '_validated_data'): if not hasattr(self, '_validated_data'):
validation_data = self.to_representation(self.instance) if self.instance else {}
validation_data.update(self.initial_data)
try: try:
self._validated_data = self.run_validation(self.initial_data) self._validated_data = self.run_validation(validation_data)
except ValidationError as exc: except ValidationError as exc:
self._validated_data = {} self._validated_data = {}
self._errors = exc.detail self._errors = exc.detail

View File

@ -1333,3 +1333,27 @@ class Issue6751Test(TestCase):
serializer.save() serializer.save()
self.assertEqual(instance.char_field, 'value changed by signal') 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)