Pass correct initial_data to ListSerializer child (#5345)

This commit is contained in:
Jamie Cockburn 2017-10-27 12:55:25 +01:00
parent 1f693c331e
commit d0b85b28b7
2 changed files with 79 additions and 3 deletions

View File

@ -631,6 +631,7 @@ class ListSerializer(BaseSerializer):
errors = [] errors = []
for item in data: for item in data:
self.child.initial_data = item
try: try:
validated = self.child.run_validation(item) validated = self.child.run_validation(item)
except ValidationError as exc: except ValidationError as exc:
@ -669,9 +670,20 @@ class ListSerializer(BaseSerializer):
) )
def create(self, validated_data): def create(self, validated_data):
return [ ret = []
self.child.create(attrs) for attrs in validated_data if hasattr(self, 'initial_data'):
] initial_data = self.initial_data
if html.is_html_input(initial_data):
initial_data = html.parse_html_list(initial_data)
else:
initial_data = None
for i, attrs in enumerate(validated_data):
if initial_data is not None:
self.child.initial_data = initial_data[i]
ret.append(self.child.create(attrs))
return ret
def save(self, **kwargs): def save(self, **kwargs):
""" """

View File

@ -138,6 +138,70 @@ class TestListSerializerContainingNestedSerializer:
assert serializer.is_valid() assert serializer.is_valid()
assert serializer.validated_data == expected_output assert serializer.validated_data == expected_output
def test_validate_initial_data(self):
data = [{"field": "value1"}, {"field": "value2"}]
expected_initial_data = list(data)
class AssertingChildSerializer(serializers.Serializer):
def validate(self, attrs):
assert self.initial_data == expected_initial_data.pop(0)
return attrs
serializer = AssertingChildSerializer(data=list(data), many=True)
assert serializer.is_valid()
assert len(expected_initial_data) == 0
def test_create_initial_data(self):
data = [{"field": "value1"}, {"field": "value2"}]
expected_initial_data = list(data)
class AssertingChildSerializer(serializers.Serializer):
field = serializers.CharField()
def create(self, validated_data):
assert self.initial_data == expected_initial_data.pop(0)
return validated_data
serializer = AssertingChildSerializer(data=data, many=True)
assert serializer.is_valid()
assert serializer.save() == data
assert len(expected_initial_data) == 0
def test_validate_initial_data_html_input(self):
expected_initial_data = [{"field": ["value1"]}, {"field": ["value2"]}]
class AssertingChildSerializer(serializers.Serializer):
def validate(self, attrs):
assert self.initial_data == expected_initial_data.pop(0)
return attrs
initial_data = MultiValueDict({
"[0]field": ["value1"],
"[1]field": ["value2"],
})
serializer = AssertingChildSerializer(data=initial_data, many=True)
assert serializer.is_valid()
assert len(expected_initial_data) == 0
def test_create_initial_data_html_input(self):
expected_initial_data = [{"field": ["value1"]}, {"field": ["value2"]}]
class AssertingChildSerializer(serializers.Serializer):
field = serializers.CharField()
def create(self, validated_data):
assert self.initial_data == expected_initial_data.pop(0)
return validated_data
initial_data = MultiValueDict({
"[0]field": ["value1"],
"[1]field": ["value2"],
})
serializer = AssertingChildSerializer(data=initial_data, many=True)
assert serializer.is_valid()
assert serializer.save() == [{"field": "value1"}, {"field": "value2"}]
assert len(expected_initial_data) == 0
class TestNestedListSerializer: class TestNestedListSerializer:
""" """