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
4edd39b2
Commit
4edd39b2
authored
Mar 04, 2014
by
Tom Christie
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1442 from Anton-Shutik/master
RelatedField default value handling fixed
parents
24a68822
dea2766a
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
67 additions
and
5 deletions
+67
-5
rest_framework/fields.py
+6
-4
rest_framework/relations.py
+9
-1
rest_framework/tests/test_serializer.py
+52
-0
No files found.
rest_framework/fields.py
View file @
4edd39b2
...
...
@@ -301,6 +301,11 @@ class WritableField(Field):
result
.
validators
=
self
.
validators
[:]
return
result
def
get_default_value
(
self
):
if
is_simple_callable
(
self
.
default
):
return
self
.
default
()
return
self
.
default
def
validate
(
self
,
value
):
if
value
in
validators
.
EMPTY_VALUES
and
self
.
required
:
raise
ValidationError
(
self
.
error_messages
[
'required'
])
...
...
@@ -349,10 +354,7 @@ class WritableField(Field):
except
KeyError
:
if
self
.
default
is
not
None
and
not
self
.
partial
:
# Note: partial updates shouldn't set defaults
if
is_simple_callable
(
self
.
default
):
native
=
self
.
default
()
else
:
native
=
self
.
default
native
=
self
.
get_default_value
()
else
:
if
self
.
required
:
raise
ValidationError
(
self
.
error_messages
[
'required'
])
...
...
rest_framework/relations.py
View file @
4edd39b2
...
...
@@ -119,6 +119,14 @@ class RelatedField(WritableField):
choices
=
property
(
_get_choices
,
_set_choices
)
### Default value handling
def
get_default_value
(
self
):
default
=
super
(
RelatedField
,
self
)
.
get_default_value
()
if
self
.
many
and
default
is
None
:
return
[]
return
default
### Regular serializer stuff...
def
field_to_native
(
self
,
obj
,
field_name
):
...
...
@@ -167,7 +175,7 @@ class RelatedField(WritableField):
except
KeyError
:
if
self
.
partial
:
return
value
=
[]
if
self
.
many
else
None
value
=
self
.
get_default_value
()
if
value
in
self
.
null_values
:
if
self
.
required
:
...
...
rest_framework/tests/test_serializer.py
View file @
4edd39b2
...
...
@@ -900,6 +900,58 @@ class DefaultValueTests(TestCase):
self
.
assertEqual
(
instance
.
text
,
'overridden'
)
class
WritableFieldDefaultValueTests
(
TestCase
):
def
setUp
(
self
):
self
.
expected
=
{
'default'
:
'value'
}
self
.
create_field
=
fields
.
WritableField
def
test_get_default_value_with_noncallable
(
self
):
field
=
self
.
create_field
(
default
=
self
.
expected
)
got
=
field
.
get_default_value
()
self
.
assertEqual
(
got
,
self
.
expected
)
def
test_get_default_value_with_callable
(
self
):
field
=
self
.
create_field
(
default
=
lambda
:
self
.
expected
)
got
=
field
.
get_default_value
()
self
.
assertEqual
(
got
,
self
.
expected
)
def
test_get_default_value_when_not_required
(
self
):
field
=
self
.
create_field
(
default
=
self
.
expected
,
required
=
False
)
got
=
field
.
get_default_value
()
self
.
assertEqual
(
got
,
self
.
expected
)
def
test_get_default_value_returns_None
(
self
):
field
=
self
.
create_field
()
got
=
field
.
get_default_value
()
self
.
assertIsNone
(
got
)
def
test_get_default_value_returns_non_True_values
(
self
):
values
=
[
None
,
''
,
False
,
0
,
[],
(),
{}]
# values that assumed as 'False' in the 'if' clause
for
expected
in
values
:
field
=
self
.
create_field
(
default
=
expected
)
got
=
field
.
get_default_value
()
self
.
assertEqual
(
got
,
expected
)
class
RelatedFieldDefaultValueTests
(
WritableFieldDefaultValueTests
):
def
setUp
(
self
):
self
.
expected
=
{
'foo'
:
'bar'
}
self
.
create_field
=
relations
.
RelatedField
def
test_get_default_value_returns_empty_list
(
self
):
field
=
self
.
create_field
(
many
=
True
)
got
=
field
.
get_default_value
()
self
.
assertListEqual
(
got
,
[])
def
test_get_default_value_returns_expected
(
self
):
expected
=
[
1
,
2
,
3
]
field
=
self
.
create_field
(
many
=
True
,
default
=
expected
)
got
=
field
.
get_default_value
()
self
.
assertListEqual
(
got
,
expected
)
class
CallableDefaultValueTests
(
TestCase
):
def
setUp
(
self
):
class
CallableDefaultValueSerializer
(
serializers
.
ModelSerializer
):
...
...
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