Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
D
django-rest-framework
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
django-rest-framework
Commits
bf25a6ec
Commit
bf25a6ec
authored
Mar 25, 2015
by
Ion Scerbatiuc
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Test case for using `allow_null` with `many=True` and a fix for it
parent
bdeb2894
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
86 additions
and
1 deletions
+86
-1
rest_framework/serializers.py
+1
-1
tests/test_serializer_nested.py
+85
-0
No files found.
rest_framework/serializers.py
View file @
bf25a6ec
...
...
@@ -50,7 +50,7 @@ from rest_framework.relations import * # NOQA # isort:skip
LIST_SERIALIZER_KWARGS
=
(
'read_only'
,
'write_only'
,
'required'
,
'default'
,
'initial'
,
'source'
,
'label'
,
'help_text'
,
'style'
,
'error_messages'
,
'allow_empty'
,
'instance'
,
'data'
,
'partial'
,
'context'
'instance'
,
'data'
,
'partial'
,
'context'
,
'allow_null'
)
...
...
tests/test_serializer_nested.py
View file @
bf25a6ec
...
...
@@ -69,3 +69,88 @@ class TestNotRequiredNestedSerializer:
input_data
=
QueryDict
(
'nested[one]=1'
)
serializer
=
self
.
Serializer
(
data
=
input_data
)
assert
serializer
.
is_valid
()
class
TestNestedSerializerWithMany
:
def
setup
(
self
):
class
PaymentInfoSerializer
(
serializers
.
Serializer
):
url
=
serializers
.
URLField
()
amount
=
serializers
.
DecimalField
(
max_digits
=
6
,
decimal_places
=
2
)
class
NestedSerializer
(
serializers
.
Serializer
):
foo
=
serializers
.
CharField
()
class
AcceptRequestSerializer
(
serializers
.
Serializer
):
ERROR_MESSAGE
=
'`payment_info` is required under this condition'
nested
=
NestedSerializer
(
many
=
True
)
payment_info
=
PaymentInfoSerializer
(
many
=
True
,
allow_null
=
True
)
def
validate_payment_info
(
self
,
value
):
if
value
is
None
and
not
self
.
context
[
'condition_to_allow_null'
]:
raise
serializers
.
ValidationError
(
self
.
ERROR_MESSAGE
)
return
value
self
.
Serializer
=
AcceptRequestSerializer
def
get_serializer
(
self
,
data
,
condition_to_allow_null
=
True
):
return
self
.
Serializer
(
data
=
data
,
context
=
{
'condition_to_allow_null'
:
condition_to_allow_null
})
def
test_null_allowed_if_allow_null_is_set
(
self
):
input_data
=
{
'nested'
:
[{
'foo'
:
'bar'
}],
'payment_info'
:
None
}
expected_data
=
{
'nested'
:
[{
'foo'
:
'bar'
}],
'payment_info'
:
None
}
serializer
=
self
.
get_serializer
(
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
=
{
'nested'
:
None
,
'payment_info'
:
None
}
serializer
=
self
.
get_serializer
(
input_data
)
assert
not
serializer
.
is_valid
()
assert
set
(
serializer
.
errors
)
==
{
'nested'
}
assert
serializer
.
errors
[
'nested'
][
0
]
==
serializer
.
error_messages
[
'null'
]
def
test_run_the_field_validation_even_if_the_field_is_null
(
self
):
input_data
=
{
'nested'
:
[{
'foo'
:
'bar'
}],
'payment_info'
:
None
,
}
serializer
=
self
.
get_serializer
(
input_data
,
condition_to_allow_null
=
False
)
assert
not
serializer
.
is_valid
()
assert
set
(
serializer
.
errors
)
==
{
'payment_info'
}
assert
serializer
.
errors
[
'payment_info'
][
0
]
==
serializer
.
ERROR_MESSAGE
def
test_expected_results_if_not_null
(
self
):
input_data
=
{
'nested'
:
[{
'foo'
:
'bar'
}],
'payment_info'
:
[
{
'url'
:
'https://domain.org/api/payment-method/1/'
,
'amount'
:
'22'
},
{
'url'
:
'https://domain.org/api/payment-method/2/'
,
'amount'
:
'33'
},
]
}
expected_data
=
{
'nested'
:
[{
'foo'
:
'bar'
}],
'payment_info'
:
[
{
'url'
:
'https://domain.org/api/payment-method/1/'
,
'amount'
:
22
},
{
'url'
:
'https://domain.org/api/payment-method/2/'
,
'amount'
:
33
},
]
}
serializer
=
self
.
get_serializer
(
input_data
)
assert
serializer
.
is_valid
()
assert
serializer
.
validated_data
==
expected_data
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment