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
ca7b1f6d
Commit
ca7b1f6d
authored
Dec 10, 2014
by
Tom Christie
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Optimizations play nicely with select_related, prefetch_related
parent
720a37d3
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
33 additions
and
12 deletions
+33
-12
rest_framework/relations.py
+1
-11
tests/test_relations_hyperlink.py
+6
-0
tests/test_relations_pk.py
+12
-0
tests/test_relations_slug.py
+14
-1
No files found.
rest_framework/relations.py
View file @
ca7b1f6d
...
...
@@ -101,17 +101,7 @@ class RelatedField(Field):
def
get_iterable
(
self
,
instance
,
source_attrs
):
relationship
=
get_attribute
(
instance
,
source_attrs
)
relationship
=
relationship
.
all
()
if
(
hasattr
(
relationship
,
'all'
))
else
relationship
if
self
.
use_pk_only_optimization
():
# Optimized case, return mock objects only containing the pk attribute.
return
[
PKOnlyObject
(
pk
=
pk
)
for
pk
in
relationship
.
values_list
(
'pk'
,
flat
=
True
)
]
# Standard case, return the object instances.
return
relationship
return
relationship
.
all
()
if
(
hasattr
(
relationship
,
'all'
))
else
relationship
@property
def
choices
(
self
):
...
...
tests/test_relations_hyperlink.py
View file @
ca7b1f6d
...
...
@@ -92,6 +92,12 @@ class HyperlinkedManyToManyTests(TestCase):
with
self
.
assertNumQueries
(
4
):
self
.
assertEqual
(
serializer
.
data
,
expected
)
def
test_many_to_many_retrieve_prefetch_related
(
self
):
queryset
=
ManyToManySource
.
objects
.
all
()
.
prefetch_related
(
'targets'
)
serializer
=
ManyToManySourceSerializer
(
queryset
,
many
=
True
,
context
=
{
'request'
:
request
})
with
self
.
assertNumQueries
(
2
):
serializer
.
data
def
test_reverse_many_to_many_retrieve
(
self
):
queryset
=
ManyToManyTarget
.
objects
.
all
()
serializer
=
ManyToManyTargetSerializer
(
queryset
,
many
=
True
,
context
=
{
'request'
:
request
})
...
...
tests/test_relations_pk.py
View file @
ca7b1f6d
...
...
@@ -71,6 +71,12 @@ class PKManyToManyTests(TestCase):
with
self
.
assertNumQueries
(
4
):
self
.
assertEqual
(
serializer
.
data
,
expected
)
def
test_many_to_many_retrieve_prefetch_related
(
self
):
queryset
=
ManyToManySource
.
objects
.
all
()
.
prefetch_related
(
'targets'
)
serializer
=
ManyToManySourceSerializer
(
queryset
,
many
=
True
)
with
self
.
assertNumQueries
(
2
):
serializer
.
data
def
test_reverse_many_to_many_retrieve
(
self
):
queryset
=
ManyToManyTarget
.
objects
.
all
()
serializer
=
ManyToManyTargetSerializer
(
queryset
,
many
=
True
)
...
...
@@ -188,6 +194,12 @@ class PKForeignKeyTests(TestCase):
with
self
.
assertNumQueries
(
3
):
self
.
assertEqual
(
serializer
.
data
,
expected
)
def
test_reverse_foreign_key_retrieve_prefetch_related
(
self
):
queryset
=
ForeignKeyTarget
.
objects
.
all
()
.
prefetch_related
(
'sources'
)
serializer
=
ForeignKeyTargetSerializer
(
queryset
,
many
=
True
)
with
self
.
assertNumQueries
(
2
):
serializer
.
data
def
test_foreign_key_update
(
self
):
data
=
{
'id'
:
1
,
'name'
:
'source-1'
,
'target'
:
2
}
instance
=
ForeignKeySource
.
objects
.
get
(
pk
=
1
)
...
...
tests/test_relations_slug.py
View file @
ca7b1f6d
...
...
@@ -54,7 +54,14 @@ class SlugForeignKeyTests(TestCase):
{
'id'
:
2
,
'name'
:
'source-2'
,
'target'
:
'target-1'
},
{
'id'
:
3
,
'name'
:
'source-3'
,
'target'
:
'target-1'
}
]
self
.
assertEqual
(
serializer
.
data
,
expected
)
with
self
.
assertNumQueries
(
4
):
self
.
assertEqual
(
serializer
.
data
,
expected
)
def
test_foreign_key_retrieve_select_related
(
self
):
queryset
=
ForeignKeySource
.
objects
.
all
()
.
select_related
(
'target'
)
serializer
=
ForeignKeySourceSerializer
(
queryset
,
many
=
True
)
with
self
.
assertNumQueries
(
1
):
serializer
.
data
def
test_reverse_foreign_key_retrieve
(
self
):
queryset
=
ForeignKeyTarget
.
objects
.
all
()
...
...
@@ -65,6 +72,12 @@ class SlugForeignKeyTests(TestCase):
]
self
.
assertEqual
(
serializer
.
data
,
expected
)
def
test_reverse_foreign_key_retrieve_prefetch_related
(
self
):
queryset
=
ForeignKeyTarget
.
objects
.
all
()
.
prefetch_related
(
'sources'
)
serializer
=
ForeignKeyTargetSerializer
(
queryset
,
many
=
True
)
with
self
.
assertNumQueries
(
2
):
serializer
.
data
def
test_foreign_key_update
(
self
):
data
=
{
'id'
:
1
,
'name'
:
'source-1'
,
'target'
:
'target-2'
}
instance
=
ForeignKeySource
.
objects
.
get
(
pk
=
1
)
...
...
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