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
2d62bcd5
Commit
2d62bcd5
authored
Jan 05, 2013
by
Mark Aaron Shirley
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add one-to-one nested update and delete functionality
parent
8e5003a1
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
54 additions
and
1 deletions
+54
-1
rest_framework/serializers.py
+14
-0
rest_framework/tests/nesting.py
+40
-1
No files found.
rest_framework/serializers.py
View file @
2d62bcd5
...
@@ -107,6 +107,7 @@ class BaseSerializer(WritableField):
...
@@ -107,6 +107,7 @@ class BaseSerializer(WritableField):
self
.
parent
=
None
self
.
parent
=
None
self
.
root
=
None
self
.
root
=
None
self
.
partial
=
partial
self
.
partial
=
partial
self
.
delete
=
False
self
.
context
=
context
or
{}
self
.
context
=
context
or
{}
...
@@ -215,6 +216,15 @@ class BaseSerializer(WritableField):
...
@@ -215,6 +216,15 @@ class BaseSerializer(WritableField):
for
field_name
,
field
in
self
.
fields
.
items
():
for
field_name
,
field
in
self
.
fields
.
items
():
field
.
initialize
(
parent
=
self
,
field_name
=
field_name
)
field
.
initialize
(
parent
=
self
,
field_name
=
field_name
)
if
isinstance
(
field
,
ModelSerializer
)
and
self
.
object
:
# Set the serializer object if it exists
pk_field_name
=
field
.
opts
.
model
.
_meta
.
pk
.
name
obj
=
getattr
(
self
.
object
,
field_name
)
nested_data
=
data
.
get
(
field_name
)
pk_val
=
nested_data
.
get
(
pk_field_name
)
if
nested_data
else
None
if
obj
and
(
getattr
(
obj
,
pk_field_name
)
==
pk_val
):
field
.
object
=
obj
field
.
delete
=
nested_data
.
get
(
'_delete'
)
try
:
try
:
field
.
field_from_native
(
data
,
files
,
field_name
,
reverted_data
)
field
.
field_from_native
(
data
,
files
,
field_name
,
reverted_data
)
except
ValidationError
as
err
:
except
ValidationError
as
err
:
...
@@ -565,6 +575,10 @@ class ModelSerializer(Serializer):
...
@@ -565,6 +575,10 @@ class ModelSerializer(Serializer):
return
instance
return
instance
def
_save
(
self
,
parent
=
None
,
fk_field
=
None
):
def
_save
(
self
,
parent
=
None
,
fk_field
=
None
):
if
self
.
delete
:
self
.
object
.
delete
()
return
if
parent
and
fk_field
:
if
parent
and
fk_field
:
setattr
(
self
.
object
,
fk_field
,
parent
)
setattr
(
self
.
object
,
fk_field
,
parent
)
self
.
object
.
save
()
self
.
object
.
save
()
...
...
rest_framework/tests/nesting.py
View file @
2d62bcd5
...
@@ -9,7 +9,8 @@ class OneToOneTarget(models.Model):
...
@@ -9,7 +9,8 @@ class OneToOneTarget(models.Model):
class
OneToOneTargetSource
(
models
.
Model
):
class
OneToOneTargetSource
(
models
.
Model
):
name
=
models
.
CharField
(
max_length
=
100
)
name
=
models
.
CharField
(
max_length
=
100
)
target
=
models
.
OneToOneField
(
OneToOneTarget
,
related_name
=
'target_source'
)
target
=
models
.
OneToOneField
(
OneToOneTarget
,
null
=
True
,
blank
=
True
,
related_name
=
'target_source'
)
class
OneToOneSource
(
models
.
Model
):
class
OneToOneSource
(
models
.
Model
):
...
@@ -83,3 +84,41 @@ class NestedOneToOneTests(TestCase):
...
@@ -83,3 +84,41 @@ class NestedOneToOneTests(TestCase):
serializer
=
OneToOneTargetSerializer
(
data
=
data
)
serializer
=
OneToOneTargetSerializer
(
data
=
data
)
self
.
assertFalse
(
serializer
.
is_valid
())
self
.
assertFalse
(
serializer
.
is_valid
())
self
.
assertEquals
(
serializer
.
errors
,
{
'target_source'
:
[{
'source'
:
[{
'name'
:
[
u'This field is required.'
]}]}]})
self
.
assertEquals
(
serializer
.
errors
,
{
'target_source'
:
[{
'source'
:
[{
'name'
:
[
u'This field is required.'
]}]}]})
def
test_one_to_one_update
(
self
):
data
=
{
'id'
:
3
,
'name'
:
u'target-3-updated'
,
'target_source'
:
{
'id'
:
3
,
'name'
:
u'target-source-3-updated'
,
'source'
:
{
'id'
:
3
,
'name'
:
u'source-3-updated'
}}}
instance
=
OneToOneTarget
.
objects
.
get
(
pk
=
3
)
serializer
=
OneToOneTargetSerializer
(
instance
,
data
=
data
)
self
.
assertTrue
(
serializer
.
is_valid
())
obj
=
serializer
.
save
()
self
.
assertEquals
(
serializer
.
data
,
data
)
self
.
assertEqual
(
obj
.
name
,
u'target-3-updated'
)
# Ensure (target 3, target_source 3, source 3) are updated,
# and everything else is as expected.
queryset
=
OneToOneTarget
.
objects
.
all
()
serializer
=
OneToOneTargetSerializer
(
queryset
)
expected
=
[
{
'id'
:
1
,
'name'
:
u'target-1'
,
'target_source'
:
{
'id'
:
1
,
'name'
:
u'target-source-1'
,
'source'
:
{
'id'
:
1
,
'name'
:
u'source-1'
}}},
{
'id'
:
2
,
'name'
:
u'target-2'
,
'target_source'
:
{
'id'
:
2
,
'name'
:
u'target-source-2'
,
'source'
:
{
'id'
:
2
,
'name'
:
u'source-2'
}}},
{
'id'
:
3
,
'name'
:
u'target-3-updated'
,
'target_source'
:
{
'id'
:
3
,
'name'
:
u'target-source-3-updated'
,
'source'
:
{
'id'
:
3
,
'name'
:
u'source-3-updated'
}}}
]
self
.
assertEquals
(
serializer
.
data
,
expected
)
def
test_one_to_one_delete
(
self
):
data
=
{
'id'
:
3
,
'name'
:
u'target-3'
,
'target_source'
:
{
'_delete'
:
True
,
'id'
:
3
,
'name'
:
u'target-source-3'
,
'source'
:
{
'id'
:
3
,
'name'
:
u'source-3'
}}}
instance
=
OneToOneTarget
.
objects
.
get
(
pk
=
3
)
serializer
=
OneToOneTargetSerializer
(
instance
,
data
=
data
)
self
.
assertTrue
(
serializer
.
is_valid
())
obj
=
serializer
.
save
()
# Ensure (target_source 3, source 3) are deleted,
# and everything else is as expected.
queryset
=
OneToOneTarget
.
objects
.
all
()
serializer
=
OneToOneTargetSerializer
(
queryset
)
expected
=
[
{
'id'
:
1
,
'name'
:
u'target-1'
,
'target_source'
:
{
'id'
:
1
,
'name'
:
u'target-source-1'
,
'source'
:
{
'id'
:
1
,
'name'
:
u'source-1'
}}},
{
'id'
:
2
,
'name'
:
u'target-2'
,
'target_source'
:
{
'id'
:
2
,
'name'
:
u'target-source-2'
,
'source'
:
{
'id'
:
2
,
'name'
:
u'source-2'
}}},
{
'id'
:
3
,
'name'
:
u'target-3'
,
'target_source'
:
None
}
]
self
.
assertEquals
(
serializer
.
data
,
expected
)
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