Revert "Fix validation for ListSerializer (#8979)" (#9283)

This reverts commit e2a4559c03.
This commit is contained in:
Asif Saif Uddin 2024-03-13 21:15:43 +06:00 committed by GitHub
parent 09a0c551ca
commit a677b09729
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 1 additions and 74 deletions

View File

@ -603,12 +603,6 @@ class ListSerializer(BaseSerializer):
self.min_length = kwargs.pop('min_length', None) self.min_length = kwargs.pop('min_length', None)
assert self.child is not None, '`child` is a required argument.' assert self.child is not None, '`child` is a required argument.'
assert not inspect.isclass(self.child), '`child` has not been instantiated.' assert not inspect.isclass(self.child), '`child` has not been instantiated.'
instance = kwargs.get('instance', [])
data = kwargs.get('data', [])
if instance and data:
assert len(data) == len(instance), 'Data and instance should have same length'
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.child.bind(field_name='', parent=self) self.child.bind(field_name='', parent=self)
@ -694,13 +688,7 @@ class ListSerializer(BaseSerializer):
ret = [] ret = []
errors = [] errors = []
for idx, item in enumerate(data): for item in data:
if (
hasattr(self, 'instance')
and self.instance
and len(self.instance) > idx
):
self.child.instance = self.instance[idx]
try: try:
validated = self.run_child_validation(item) validated = self.run_child_validation(item)
except ValidationError as exc: except ValidationError as exc:

View File

@ -2,7 +2,6 @@ import inspect
import pickle import pickle
import re import re
import sys import sys
import unittest
from collections import ChainMap from collections import ChainMap
from collections.abc import Mapping from collections.abc import Mapping
@ -784,63 +783,3 @@ class TestSetValueMethod:
ret = {'a': 1} ret = {'a': 1}
self.s.set_value(ret, ['x', 'y'], 2) self.s.set_value(ret, ['x', 'y'], 2)
assert ret == {'a': 1, 'x': {'y': 2}} assert ret == {'a': 1, 'x': {'y': 2}}
class MyClass(models.Model):
name = models.CharField(max_length=100)
value = models.CharField(max_length=100, blank=True)
app_label = "test"
@property
def is_valid(self):
return self.name == 'valid'
class MyClassSerializer(serializers.ModelSerializer):
class Meta:
model = MyClass
fields = ('id', 'name', 'value')
def validate_value(self, value):
if value and not self.instance.is_valid:
raise serializers.ValidationError(
'Status cannot be set for invalid instance')
return value
class TestMultipleObjectsValidation(unittest.TestCase):
def setUp(self):
self.objs = [
MyClass(name='valid'),
MyClass(name='invalid'),
MyClass(name='other'),
]
def test_multiple_objects_are_validated_separately(self):
serializer = MyClassSerializer(
data=[{'value': 'set', 'id': instance.id} for instance in
self.objs],
instance=self.objs,
many=True,
partial=True,
)
assert not serializer.is_valid()
assert serializer.errors == [
{},
{'value': ['Status cannot be set for invalid instance']},
{'value': ['Status cannot be set for invalid instance']}
]
def test_exception_raised_when_data_and_instance_length_different(self):
with self.assertRaises(AssertionError):
MyClassSerializer(
data=[{'value': 'set', 'id': instance.id} for instance in
self.objs],
instance=self.objs[:-1],
many=True,
partial=True,
)