diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 2eef6eeb51..4c63a20500 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -545,6 +545,8 @@ def to_internal_value(self, data): for item in data: try: + if isinstance(self.instance, QuerySet): + self.child.instance = self.instance.get(pk=item['id']) validated = self.child.run_validation(item) except ValidationError as exc: errors.append(exc.detail) diff --git a/tests/test_validation.py b/tests/test_validation.py index 4234efd364..16f5227232 100644 --- a/tests/test_validation.py +++ b/tests/test_validation.py @@ -46,6 +46,42 @@ class Meta: fields = ('renamed',) +class UniqueTogetherModel(models.Model): + foo = models.IntegerField() + bar = models.IntegerField() + + class Meta(object): + unique_together = ('foo', 'bar') + + +class ExampleSerializer(serializers.ModelSerializer): + class Meta(object): + model = UniqueTogetherModel + + +class TestUniqueTogether(TestCase): + def test_validation(self): + """ + Ensure that validation works when model has unique together validation. + """ + UniqueTogetherModel.objects.all().delete() + obj = UniqueTogetherModel.objects.create(foo=1, bar=2) + + s = ExampleSerializer( + UniqueTogetherModel.objects.all(), + data=[ + { + 'foo': 5, + 'id': obj.pk, + } + ], + partial=True, + many=True, + ) + + s.is_valid(raise_exception=True) + + class TestPreSaveValidationExclusionsSerializer(TestCase): def test_renamed_fields_are_model_validated(self): """