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
fc1047e9
Commit
fc1047e9
authored
Nov 13, 2013
by
Tom Christie
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1224 from alexjg/allow-aggregate-ordering
Allow aggregate ordering
parents
8552e79d
e2994294
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
40 additions
and
0 deletions
+40
-0
rest_framework/filters.py
+1
-0
rest_framework/tests/test_filters.py
+39
-0
No files found.
rest_framework/filters.py
View file @
fc1047e9
...
@@ -124,6 +124,7 @@ class OrderingFilter(BaseFilterBackend):
...
@@ -124,6 +124,7 @@ class OrderingFilter(BaseFilterBackend):
def
remove_invalid_fields
(
self
,
queryset
,
ordering
):
def
remove_invalid_fields
(
self
,
queryset
,
ordering
):
field_names
=
[
field
.
name
for
field
in
queryset
.
model
.
_meta
.
fields
]
field_names
=
[
field
.
name
for
field
in
queryset
.
model
.
_meta
.
fields
]
field_names
+=
queryset
.
query
.
aggregates
.
keys
()
return
[
term
for
term
in
ordering
if
term
.
lstrip
(
'-'
)
in
field_names
]
return
[
term
for
term
in
ordering
if
term
.
lstrip
(
'-'
)
in
field_names
]
def
filter_queryset
(
self
,
request
,
queryset
,
view
):
def
filter_queryset
(
self
,
request
,
queryset
,
view
):
...
...
rest_framework/tests/test_filters.py
View file @
fc1047e9
...
@@ -363,6 +363,12 @@ class OrdringFilterModel(models.Model):
...
@@ -363,6 +363,12 @@ class OrdringFilterModel(models.Model):
text
=
models
.
CharField
(
max_length
=
100
)
text
=
models
.
CharField
(
max_length
=
100
)
class
OrderingFilterRelatedModel
(
models
.
Model
):
related_object
=
models
.
ForeignKey
(
OrdringFilterModel
,
related_name
=
"relateds"
)
class
OrderingFilterTests
(
TestCase
):
class
OrderingFilterTests
(
TestCase
):
def
setUp
(
self
):
def
setUp
(
self
):
# Sequence of title/text is:
# Sequence of title/text is:
...
@@ -472,3 +478,36 @@ class OrderingFilterTests(TestCase):
...
@@ -472,3 +478,36 @@ class OrderingFilterTests(TestCase):
{
'id'
:
1
,
'title'
:
'zyx'
,
'text'
:
'abc'
},
{
'id'
:
1
,
'title'
:
'zyx'
,
'text'
:
'abc'
},
]
]
)
)
def
test_ordering_by_aggregate_field
(
self
):
# create some related models to aggregate order by
num_objs
=
[
2
,
5
,
3
]
for
obj
,
num_relateds
in
zip
(
OrdringFilterModel
.
objects
.
all
(),
num_objs
):
for
_
in
range
(
num_relateds
):
new_related
=
OrderingFilterRelatedModel
(
related_object
=
obj
)
new_related
.
save
()
class
OrderingListView
(
generics
.
ListAPIView
):
model
=
OrdringFilterModel
filter_backends
=
(
filters
.
OrderingFilter
,)
ordering
=
'title'
queryset
=
OrdringFilterModel
.
objects
.
all
()
.
annotate
(
models
.
Count
(
"relateds"
))
view
=
OrderingListView
.
as_view
()
request
=
factory
.
get
(
'?ordering=relateds__count'
)
response
=
view
(
request
)
self
.
assertEqual
(
response
.
data
,
[
{
'id'
:
1
,
'title'
:
'zyx'
,
'text'
:
'abc'
},
{
'id'
:
3
,
'title'
:
'xwv'
,
'text'
:
'cde'
},
{
'id'
:
2
,
'title'
:
'yxw'
,
'text'
:
'bcd'
},
]
)
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