diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 7afddfd82..80b7c6d6d 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -367,7 +367,7 @@ class Serializer(BaseSerializer): # We override the default field access in order to support # nested HTML forms. if html.is_html_input(dictionary): - return html.parse_html_dict(dictionary, prefix=self.field_name) + return html.parse_html_dict(dictionary, prefix=self.field_name) or empty return dictionary.get(self.field_name, empty) def run_validation(self, data=empty): diff --git a/tests/test_serializer_nested.py b/tests/test_serializer_nested.py index f5e4b26ad..b14a58c9e 100644 --- a/tests/test_serializer_nested.py +++ b/tests/test_serializer_nested.py @@ -1,3 +1,5 @@ +from django.http import QueryDict + from rest_framework import serializers @@ -38,3 +40,32 @@ class TestNestedSerializer: } serializer = self.Serializer() assert serializer.data == expected_data + + +class TestNotRequiredNestedSerializer: + def setup(self): + class NestedSerializer(serializers.Serializer): + one = serializers.IntegerField(max_value=10) + + class TestSerializer(serializers.Serializer): + nested = NestedSerializer(required=False) + + self.Serializer = TestSerializer + + def test_json_validate(self): + input_data = {} + serializer = self.Serializer(data=input_data) + assert serializer.is_valid() + + input_data = {'nested': {'one': '1'}} + serializer = self.Serializer(data=input_data) + assert serializer.is_valid() + + def test_multipart_validate(self): + input_data = QueryDict('') + serializer = self.Serializer(data=input_data) + assert serializer.is_valid() + + input_data = QueryDict('nested[one]=1') + serializer = self.Serializer(data=input_data) + assert serializer.is_valid()