mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-01-23 15:54:16 +03:00
Merge pull request #2766 from delinhabit/allow-null-list-serializer
Modify subtle ChildSerializer(many=True, allow_null=True) behavior.
This commit is contained in:
commit
a543fae180
|
@ -48,7 +48,7 @@ from rest_framework.relations import * # NOQA # isort:skip
|
||||||
LIST_SERIALIZER_KWARGS = (
|
LIST_SERIALIZER_KWARGS = (
|
||||||
'read_only', 'write_only', 'required', 'default', 'initial', 'source',
|
'read_only', 'write_only', 'required', 'default', 'initial', 'source',
|
||||||
'label', 'help_text', 'style', 'error_messages', 'allow_empty',
|
'label', 'help_text', 'style', 'error_messages', 'allow_empty',
|
||||||
'instance', 'data', 'partial', 'context'
|
'instance', 'data', 'partial', 'context', 'allow_null'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -69,3 +69,59 @@ class TestNotRequiredNestedSerializer:
|
||||||
input_data = QueryDict('nested[one]=1')
|
input_data = QueryDict('nested[one]=1')
|
||||||
serializer = self.Serializer(data=input_data)
|
serializer = self.Serializer(data=input_data)
|
||||||
assert serializer.is_valid()
|
assert serializer.is_valid()
|
||||||
|
|
||||||
|
|
||||||
|
class TestNestedSerializerWithMany:
|
||||||
|
def setup(self):
|
||||||
|
class NestedSerializer(serializers.Serializer):
|
||||||
|
example = serializers.IntegerField(max_value=10)
|
||||||
|
|
||||||
|
class TestSerializer(serializers.Serializer):
|
||||||
|
allow_null = NestedSerializer(many=True, allow_null=True)
|
||||||
|
not_allow_null = NestedSerializer(many=True)
|
||||||
|
|
||||||
|
self.Serializer = TestSerializer
|
||||||
|
|
||||||
|
def test_null_allowed_if_allow_null_is_set(self):
|
||||||
|
input_data = {
|
||||||
|
'allow_null': None,
|
||||||
|
'not_allow_null': [{'example': '2'}, {'example': '3'}]
|
||||||
|
}
|
||||||
|
expected_data = {
|
||||||
|
'allow_null': None,
|
||||||
|
'not_allow_null': [{'example': 2}, {'example': 3}]
|
||||||
|
}
|
||||||
|
serializer = self.Serializer(data=input_data)
|
||||||
|
|
||||||
|
assert serializer.is_valid(), serializer.errors
|
||||||
|
assert serializer.validated_data == expected_data
|
||||||
|
|
||||||
|
def test_null_is_not_allowed_if_allow_null_is_not_set(self):
|
||||||
|
input_data = {
|
||||||
|
'allow_null': None,
|
||||||
|
'not_allow_null': None
|
||||||
|
}
|
||||||
|
serializer = self.Serializer(data=input_data)
|
||||||
|
|
||||||
|
assert not serializer.is_valid()
|
||||||
|
|
||||||
|
expected_errors = {'not_allow_null': [serializer.error_messages['null']]}
|
||||||
|
assert serializer.errors == expected_errors
|
||||||
|
|
||||||
|
def test_run_the_field_validation_even_if_the_field_is_null(self):
|
||||||
|
class TestSerializer(self.Serializer):
|
||||||
|
validation_was_run = False
|
||||||
|
|
||||||
|
def validate_allow_null(self, value):
|
||||||
|
TestSerializer.validation_was_run = True
|
||||||
|
return value
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'allow_null': None,
|
||||||
|
'not_allow_null': [{'example': 2}]
|
||||||
|
}
|
||||||
|
serializer = TestSerializer(data=input_data)
|
||||||
|
|
||||||
|
assert serializer.is_valid()
|
||||||
|
assert serializer.validated_data == input_data
|
||||||
|
assert TestSerializer.validation_was_run
|
||||||
|
|
Loading…
Reference in New Issue
Block a user