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
bf06f034
Commit
bf06f034
authored
Oct 22, 2012
by
Tom Christie
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #311 from j4mie/fix-reverse-relations
Fix serialization of reverse relationships
parents
d53ee8a1
45d4622f
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
53 additions
and
10 deletions
+53
-10
rest_framework/serializers.py
+13
-10
rest_framework/tests/models.py
+11
-0
rest_framework/tests/serializer.py
+29
-0
No files found.
rest_framework/serializers.py
View file @
bf06f034
...
...
@@ -247,6 +247,19 @@ class BaseSerializer(Field):
if
not
self
.
_errors
:
return
self
.
restore_object
(
attrs
,
instance
=
getattr
(
self
,
'object'
,
None
))
def
field_to_native
(
self
,
obj
,
field_name
):
"""
Override default so that we can apply ModelSerializer as a nested
field to relationships.
"""
obj
=
getattr
(
obj
,
self
.
source
or
field_name
)
# If the object has an "all" method, assume it's a relationship
if
is_simple_callable
(
getattr
(
obj
,
'all'
,
None
)):
return
[
self
.
to_native
(
item
)
for
item
in
obj
.
all
()]
return
self
.
to_native
(
obj
)
@property
def
errors
(
self
):
"""
...
...
@@ -295,16 +308,6 @@ class ModelSerializer(Serializer):
"""
_options_class
=
ModelSerializerOptions
def
field_to_native
(
self
,
obj
,
field_name
):
"""
Override default so that we can apply ModelSerializer as a nested
field to relationships.
"""
obj
=
getattr
(
obj
,
self
.
source
or
field_name
)
if
obj
.
__class__
.
__name__
in
(
'RelatedManager'
,
'ManyRelatedManager'
):
return
[
self
.
to_native
(
item
)
for
item
in
obj
.
all
()]
return
self
.
to_native
(
obj
)
def
default_fields
(
self
,
serialize
,
obj
=
None
,
data
=
None
,
nested
=
False
):
"""
Return all the fields that should be serialized for the model.
...
...
rest_framework/tests/models.py
View file @
bf06f034
...
...
@@ -92,6 +92,17 @@ class Comment(RESTFrameworkModel):
content
=
models
.
CharField
(
max_length
=
200
)
created
=
models
.
DateTimeField
(
auto_now_add
=
True
)
class
ActionItem
(
RESTFrameworkModel
):
title
=
models
.
CharField
(
max_length
=
200
)
done
=
models
.
BooleanField
(
default
=
False
)
# Models for reverse relations
class
BlogPost
(
RESTFrameworkModel
):
title
=
models
.
CharField
(
max_length
=
100
)
class
BlogPostComment
(
RESTFrameworkModel
):
text
=
models
.
TextField
()
blog_post
=
models
.
ForeignKey
(
BlogPost
)
rest_framework/tests/serializer.py
View file @
bf06f034
...
...
@@ -302,3 +302,32 @@ class CallableDefaultValueTests(TestCase):
self
.
assertEquals
(
len
(
self
.
objects
.
all
()),
1
)
self
.
assertEquals
(
instance
.
pk
,
1
)
self
.
assertEquals
(
instance
.
text
,
'overridden'
)
class
ManyRelatedTests
(
TestCase
):
def
setUp
(
self
):
class
BlogPostCommentSerializer
(
serializers
.
Serializer
):
text
=
serializers
.
CharField
()
class
BlogPostSerializer
(
serializers
.
Serializer
):
title
=
serializers
.
CharField
()
comments
=
BlogPostCommentSerializer
(
source
=
'blogpostcomment_set'
)
self
.
serializer_class
=
BlogPostSerializer
def
test_reverse_relations
(
self
):
post
=
BlogPost
.
objects
.
create
(
title
=
"Test blog post"
)
post
.
blogpostcomment_set
.
create
(
text
=
"I hate this blog post"
)
post
.
blogpostcomment_set
.
create
(
text
=
"I love this blog post"
)
serializer
=
self
.
serializer_class
(
instance
=
post
)
expected
=
{
'title'
:
'Test blog post'
,
'comments'
:
[
{
'text'
:
'I hate this blog post'
},
{
'text'
:
'I love this blog post'
}
]
}
self
.
assertEqual
(
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