mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-04 12:30:11 +03:00
Pass correct initial_data to ListSerializer child (#5345)
This commit is contained in:
parent
1f693c331e
commit
d0b85b28b7
|
@ -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):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -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:
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in New Issue
Block a user