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
d379997a
Commit
d379997a
authored
Jan 01, 2013
by
Mark
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #540 from maspwr/m2m-related
Don't persist relation changes in ModelSerializer#restore_object()
parents
eff833b3
f62acf02
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
49 additions
and
25 deletions
+49
-25
docs/topics/release-notes.md
+4
-0
rest_framework/serializers.py
+17
-17
rest_framework/tests/relations_hyperlink.py
+13
-3
rest_framework/tests/relations_pk.py
+15
-5
No files found.
docs/topics/release-notes.md
View file @
d379997a
...
...
@@ -16,6 +16,10 @@ Major version numbers (x.0.0) are reserved for project milestones. No major poi
## 2.1.x series
### Master
*
Relation changes are no longer persisted in
`.restore_object`
### 2.1.14
**Date**
: 31st Dec 2012
...
...
rest_framework/serializers.py
View file @
d379997a
...
...
@@ -498,28 +498,28 @@ class ModelSerializer(Serializer):
self
.
m2m_data
=
{}
self
.
related_data
=
{}
# Reverse fk relations
for
(
obj
,
model
)
in
self
.
opts
.
model
.
_meta
.
get_all_related_objects_with_model
():
field_name
=
obj
.
field
.
related_query_name
()
if
field_name
in
attrs
:
self
.
related_data
[
field_name
]
=
attrs
.
pop
(
field_name
)
# Reverse m2m relations
for
(
obj
,
model
)
in
self
.
opts
.
model
.
_meta
.
get_all_related_m2m_objects_with_model
():
field_name
=
obj
.
field
.
related_query_name
()
if
field_name
in
attrs
:
self
.
m2m_data
[
field_name
]
=
attrs
.
pop
(
field_name
)
# Forward m2m relations
for
field
in
self
.
opts
.
model
.
_meta
.
many_to_many
:
if
field
.
name
in
attrs
:
self
.
m2m_data
[
field
.
name
]
=
attrs
.
pop
(
field
.
name
)
if
instance
is
not
None
:
for
key
,
val
in
attrs
.
items
():
setattr
(
instance
,
key
,
val
)
else
:
# Reverse fk relations
for
(
obj
,
model
)
in
self
.
opts
.
model
.
_meta
.
get_all_related_objects_with_model
():
field_name
=
obj
.
field
.
related_query_name
()
if
field_name
in
attrs
:
self
.
related_data
[
field_name
]
=
attrs
.
pop
(
field_name
)
# Reverse m2m relations
for
(
obj
,
model
)
in
self
.
opts
.
model
.
_meta
.
get_all_related_m2m_objects_with_model
():
field_name
=
obj
.
field
.
related_query_name
()
if
field_name
in
attrs
:
self
.
m2m_data
[
field_name
]
=
attrs
.
pop
(
field_name
)
# Forward m2m relations
for
field
in
self
.
opts
.
model
.
_meta
.
many_to_many
:
if
field
.
name
in
attrs
:
self
.
m2m_data
[
field
.
name
]
=
attrs
.
pop
(
field
.
name
)
instance
=
self
.
opts
.
model
(
**
attrs
)
try
:
...
...
rest_framework/tests/relations_hyperlink.py
View file @
d379997a
...
...
@@ -114,8 +114,8 @@ class HyperlinkedManyToManyTests(TestCase):
instance
=
ManyToManySource
.
objects
.
get
(
pk
=
1
)
serializer
=
ManyToManySourceSerializer
(
instance
,
data
=
data
)
self
.
assertTrue
(
serializer
.
is_valid
())
self
.
assertEquals
(
serializer
.
data
,
data
)
serializer
.
save
()
self
.
assertEquals
(
serializer
.
data
,
data
)
# Ensure source 1 is updated, and everything else is as expected
queryset
=
ManyToManySource
.
objects
.
all
()
...
...
@@ -132,8 +132,8 @@ class HyperlinkedManyToManyTests(TestCase):
instance
=
ManyToManyTarget
.
objects
.
get
(
pk
=
1
)
serializer
=
ManyToManyTargetSerializer
(
instance
,
data
=
data
)
self
.
assertTrue
(
serializer
.
is_valid
())
self
.
assertEquals
(
serializer
.
data
,
data
)
serializer
.
save
()
self
.
assertEquals
(
serializer
.
data
,
data
)
# Ensure target 1 is updated, and everything else is as expected
queryset
=
ManyToManyTarget
.
objects
.
all
()
...
...
@@ -239,8 +239,18 @@ class HyperlinkedForeignKeyTests(TestCase):
instance
=
ForeignKeyTarget
.
objects
.
get
(
pk
=
2
)
serializer
=
ForeignKeyTargetSerializer
(
instance
,
data
=
data
)
self
.
assertTrue
(
serializer
.
is_valid
())
self
.
assertEquals
(
serializer
.
data
,
data
)
# We shouldn't have saved anything to the db yet since save
# hasn't been called.
queryset
=
ForeignKeyTarget
.
objects
.
all
()
new_serializer
=
ForeignKeyTargetSerializer
(
queryset
)
expected
=
[
{
'url'
:
'/foreignkeytarget/1/'
,
'name'
:
u'target-1'
,
'sources'
:
[
'/foreignkeysource/1/'
,
'/foreignkeysource/2/'
,
'/foreignkeysource/3/'
]},
{
'url'
:
'/foreignkeytarget/2/'
,
'name'
:
u'target-2'
,
'sources'
:
[]},
]
self
.
assertEquals
(
new_serializer
.
data
,
expected
)
serializer
.
save
()
self
.
assertEquals
(
serializer
.
data
,
data
)
# Ensure target 2 is update, and everything else is as expected
queryset
=
ForeignKeyTarget
.
objects
.
all
()
...
...
rest_framework/tests/relations_pk.py
View file @
d379997a
...
...
@@ -99,8 +99,8 @@ class PKManyToManyTests(TestCase):
instance
=
ManyToManySource
.
objects
.
get
(
pk
=
1
)
serializer
=
ManyToManySourceSerializer
(
instance
,
data
=
data
)
self
.
assertTrue
(
serializer
.
is_valid
())
self
.
assertEquals
(
serializer
.
data
,
data
)
serializer
.
save
()
self
.
assertEquals
(
serializer
.
data
,
data
)
# Ensure source 1 is updated, and everything else is as expected
queryset
=
ManyToManySource
.
objects
.
all
()
...
...
@@ -117,8 +117,8 @@ class PKManyToManyTests(TestCase):
instance
=
ManyToManyTarget
.
objects
.
get
(
pk
=
1
)
serializer
=
ManyToManyTargetSerializer
(
instance
,
data
=
data
)
self
.
assertTrue
(
serializer
.
is_valid
())
self
.
assertEquals
(
serializer
.
data
,
data
)
serializer
.
save
()
self
.
assertEquals
(
serializer
.
data
,
data
)
# Ensure target 1 is updated, and everything else is as expected
queryset
=
ManyToManyTarget
.
objects
.
all
()
...
...
@@ -221,8 +221,18 @@ class PKForeignKeyTests(TestCase):
instance
=
ForeignKeyTarget
.
objects
.
get
(
pk
=
2
)
serializer
=
ForeignKeyTargetSerializer
(
instance
,
data
=
data
)
self
.
assertTrue
(
serializer
.
is_valid
())
self
.
assertEquals
(
serializer
.
data
,
data
)
# We shouldn't have saved anything to the db yet since save
# hasn't been called.
queryset
=
ForeignKeyTarget
.
objects
.
all
()
new_serializer
=
ForeignKeyTargetSerializer
(
queryset
)
expected
=
[
{
'id'
:
1
,
'name'
:
u'target-1'
,
'sources'
:
[
1
,
2
,
3
]},
{
'id'
:
2
,
'name'
:
u'target-2'
,
'sources'
:
[]},
]
self
.
assertEquals
(
new_serializer
.
data
,
expected
)
serializer
.
save
()
self
.
assertEquals
(
serializer
.
data
,
data
)
# Ensure target 2 is update, and everything else is as expected
queryset
=
ForeignKeyTarget
.
objects
.
all
()
...
...
@@ -241,7 +251,7 @@ class PKForeignKeyTests(TestCase):
self
.
assertEquals
(
serializer
.
data
,
data
)
self
.
assertEqual
(
obj
.
name
,
u'source-4'
)
# Ensure source
1 is updat
ed, and everything else is as expected
# Ensure source
4 is add
ed, and everything else is as expected
queryset
=
ForeignKeySource
.
objects
.
all
()
serializer
=
ForeignKeySourceSerializer
(
queryset
)
expected
=
[
...
...
@@ -260,7 +270,7 @@ class PKForeignKeyTests(TestCase):
self
.
assertEquals
(
serializer
.
data
,
data
)
self
.
assertEqual
(
obj
.
name
,
u'target-3'
)
# Ensure target
4
is added, and everything else is as expected
# Ensure target
3
is added, and everything else is as expected
queryset
=
ForeignKeyTarget
.
objects
.
all
()
serializer
=
ForeignKeyTargetSerializer
(
queryset
)
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