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
1d404874
Commit
1d404874
authored
Apr 16, 2014
by
Xavier Ordoquy
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1527 from Ian-Foote/generic_foreign_key
Set GenericForeignKey fields on object before save
parents
03b4c60b
853c7a16
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
29 additions
and
10 deletions
+29
-10
rest_framework/serializers.py
+11
-10
rest_framework/tests/test_genericrelations.py
+18
-0
No files found.
rest_framework/serializers.py
View file @
1d404874
...
@@ -16,6 +16,7 @@ import datetime
...
@@ -16,6 +16,7 @@ import datetime
import
inspect
import
inspect
import
types
import
types
from
decimal
import
Decimal
from
decimal
import
Decimal
from
django.contrib.contenttypes.generic
import
GenericForeignKey
from
django.core.paginator
import
Page
from
django.core.paginator
import
Page
from
django.db
import
models
from
django.db
import
models
from
django.forms
import
widgets
from
django.forms
import
widgets
...
@@ -943,6 +944,8 @@ class ModelSerializer(Serializer):
...
@@ -943,6 +944,8 @@ class ModelSerializer(Serializer):
# Forward m2m relations
# Forward m2m relations
for
field
in
meta
.
many_to_many
+
meta
.
virtual_fields
:
for
field
in
meta
.
many_to_many
+
meta
.
virtual_fields
:
if
isinstance
(
field
,
GenericForeignKey
):
continue
if
field
.
name
in
attrs
:
if
field
.
name
in
attrs
:
m2m_data
[
field
.
name
]
=
attrs
.
pop
(
field
.
name
)
m2m_data
[
field
.
name
]
=
attrs
.
pop
(
field
.
name
)
...
@@ -952,17 +955,15 @@ class ModelSerializer(Serializer):
...
@@ -952,17 +955,15 @@ class ModelSerializer(Serializer):
if
isinstance
(
self
.
fields
.
get
(
field_name
,
None
),
Serializer
):
if
isinstance
(
self
.
fields
.
get
(
field_name
,
None
),
Serializer
):
nested_forward_relations
[
field_name
]
=
attrs
[
field_name
]
nested_forward_relations
[
field_name
]
=
attrs
[
field_name
]
# Update an existing instance...
# Create an empty instance of the model
if
instance
is
not
None
:
if
instance
is
None
:
for
key
,
val
in
attrs
.
items
():
instance
=
self
.
opts
.
model
()
try
:
setattr
(
instance
,
key
,
val
)
except
ValueError
:
self
.
_errors
[
key
]
=
self
.
error_messages
[
'required'
]
# ...or create a new instance
for
key
,
val
in
attrs
.
items
():
else
:
try
:
instance
=
self
.
opts
.
model
(
**
attrs
)
setattr
(
instance
,
key
,
val
)
except
ValueError
:
self
.
_errors
[
key
]
=
self
.
error_messages
[
'required'
]
# Any relations that cannot be set until we've
# Any relations that cannot be set until we've
# saved the model get hidden away on these
# saved the model get hidden away on these
...
...
rest_framework/tests/test_genericrelations.py
View file @
1d404874
...
@@ -131,3 +131,21 @@ class TestGenericRelations(TestCase):
...
@@ -131,3 +131,21 @@ class TestGenericRelations(TestCase):
}
}
]
]
self
.
assertEqual
(
serializer
.
data
,
expected
)
self
.
assertEqual
(
serializer
.
data
,
expected
)
def
test_restore_object_generic_fk
(
self
):
"""
Ensure an object with a generic foreign key can be restored.
"""
class
TagSerializer
(
serializers
.
ModelSerializer
):
class
Meta
:
model
=
Tag
exclude
=
(
'content_type'
,
'object_id'
)
serializer
=
TagSerializer
()
bookmark
=
Bookmark
(
url
=
'http://example.com'
)
attrs
=
{
'tagged_item'
:
bookmark
,
'tag'
:
'example'
}
tag
=
serializer
.
restore_object
(
attrs
)
self
.
assertEqual
(
tag
.
tagged_item
,
bookmark
)
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