diff --git a/rest_framework/validators.py b/rest_framework/validators.py index a152c6362f..8006e8788e 100644 --- a/rest_framework/validators.py +++ b/rest_framework/validators.py @@ -188,7 +188,10 @@ def __call__(self, attrs, serializer): if attrs[field_name] != getattr(serializer.instance, field_name) ] - condition_kwargs = {source: attrs[source] for source in self.condition_fields} + condition_kwargs = { + serializer.fields[field_name].source: attrs[serializer.fields[field_name].source] + for field_name in self.condition_fields + } if checked_values and None not in checked_values and qs_exists_with_condition(queryset, self.condition, condition_kwargs): field_names = ', '.join(self.fields) message = self.message.format(field_names=field_names) diff --git a/tests/test_validators.py b/tests/test_validators.py index 29b097ef39..d19734d98c 100644 --- a/tests/test_validators.py +++ b/tests/test_validators.py @@ -683,6 +683,24 @@ def test_nullable_unique_constraint_fields_are_not_required(self): result = serializer.save() self.assertIsInstance(result, UniqueConstraintNullableModel) + def test_unique_constraint_source(self): + class SourceUniqueConstraintSerializer(serializers.ModelSerializer): + raceName = serializers.CharField(source="race_name") + + class Meta: + model = UniqueConstraintModel + fields = ("raceName", "position", "global_id", "fancy_conditions") + + serializer = SourceUniqueConstraintSerializer( + data={ + "raceName": "example", + "position": 5, + "global_id": 11, + "fancy_conditions": 11, + } + ) + assert serializer.is_valid() + # Tests for `UniqueForDateValidator` # ----------------------------------