Skip to content

Commit 5439967

Browse files
Fix UniqueTogetherValidator to handle fields w/ source attr (#9688)
* Add failing test for `UniqueConstraint` validation with `source` attribute * Fix `UniqueTogetherValidator` to handle fields with source attribute * split inner sources logic out to tuple comprehension
1 parent 07d3e1e commit 5439967

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

rest_framework/validators.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,8 @@ def __call__(self, attrs, serializer):
188188
if attrs[field_name] != getattr(serializer.instance, field_name)
189189
]
190190

191-
condition_kwargs = {source: attrs[source] for source in self.condition_fields}
191+
condition_sources = (serializer.fields[field_name].source for field_name in self.condition_fields)
192+
condition_kwargs = {source: attrs[source] for source in condition_sources}
192193
if checked_values and None not in checked_values and qs_exists_with_condition(queryset, self.condition, condition_kwargs):
193194
field_names = ', '.join(self.fields)
194195
message = self.message.format(field_names=field_names)

tests/test_validators.py

+18
Original file line numberDiff line numberDiff line change
@@ -683,6 +683,24 @@ def test_nullable_unique_constraint_fields_are_not_required(self):
683683
result = serializer.save()
684684
self.assertIsInstance(result, UniqueConstraintNullableModel)
685685

686+
def test_unique_constraint_source(self):
687+
class SourceUniqueConstraintSerializer(serializers.ModelSerializer):
688+
raceName = serializers.CharField(source="race_name")
689+
690+
class Meta:
691+
model = UniqueConstraintModel
692+
fields = ("raceName", "position", "global_id", "fancy_conditions")
693+
694+
serializer = SourceUniqueConstraintSerializer(
695+
data={
696+
"raceName": "example",
697+
"position": 5,
698+
"global_id": 11,
699+
"fancy_conditions": 11,
700+
}
701+
)
702+
assert serializer.is_valid()
703+
686704

687705
# Tests for `UniqueForDateValidator`
688706
# ----------------------------------

0 commit comments

Comments
 (0)