From 2c79b6015bfc6f94bbf08d9f1ce77da9c01abffd Mon Sep 17 00:00:00 2001 From: "zainnadeem(RedOpsCell)" Date: Wed, 10 Jun 2026 14:14:51 +0500 Subject: [PATCH] Raise clear error for unsupported list update validation --- rest_framework/validators.py | 12 ++++++++++++ tests/test_validators.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/rest_framework/validators.py b/rest_framework/validators.py index cc759b39cc..aaa2f10147 100644 --- a/rest_framework/validators.py +++ b/rest_framework/validators.py @@ -171,6 +171,18 @@ def exclude_current_instance(self, attrs, queryset, instance): return queryset def __call__(self, attrs, serializer): + if ( + serializer.instance is not None and + getattr(serializer.parent, 'many', False) and + not hasattr(serializer.instance, 'pk') + ): + raise RuntimeError( + '`UniqueTogetherValidator` cannot determine the current ' + 'instance during a multiple update. Override ' + '`ListSerializer.run_child_validation()` to set ' + '`child.instance` before validation.' + ) + self.enforce_required_fields(attrs, serializer) queryset = self.queryset queryset = self.filter_queryset(attrs, queryset, serializer) diff --git a/tests/test_validators.py b/tests/test_validators.py index 289becb7d0..ed1871c81c 100644 --- a/tests/test_validators.py +++ b/tests/test_validators.py @@ -248,6 +248,36 @@ def test_updated_instance_excluded_from_unique_together(self): 'position': 1 } + def test_many_update_requires_child_instance(self): + class ListUpdateSerializer(serializers.ListSerializer): + def update(self, instance, validated_data): + return instance + + class Serializer(UniquenessTogetherSerializer): + id = serializers.IntegerField() + + class Meta(UniquenessTogetherSerializer.Meta): + list_serializer_class = ListUpdateSerializer + + serializer = Serializer( + instance=UniquenessTogetherModel.objects.all(), + data=[{ + 'id': self.instance.pk, + 'race_name': self.instance.race_name, + 'position': self.instance.position, + }], + many=True, + ) + message = ( + '`UniqueTogetherValidator` cannot determine the current instance ' + 'during a multiple update. Override ' + '`ListSerializer.run_child_validation()` to set `child.instance` ' + 'before validation.' + ) + + with pytest.raises(RuntimeError, match=re.escape(message)): + serializer.is_valid() + def test_unique_together_is_required(self): """ In a unique together validation, all fields are required.