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
f4e02446
Commit
f4e02446
authored
Sep 05, 2014
by
Tom Christie
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1836 from jpadilla/filter-ordering
Preserve default ordering when using filtering
parents
2b47c6b7
ab213cbc
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
57 additions
and
13 deletions
+57
-13
rest_framework/filters.py
+0
-1
tests/test_filters.py
+57
-12
No files found.
rest_framework/filters.py
View file @
f4e02446
...
@@ -56,7 +56,6 @@ class DjangoFilterBackend(BaseFilterBackend):
...
@@ -56,7 +56,6 @@ class DjangoFilterBackend(BaseFilterBackend):
class
Meta
:
class
Meta
:
model
=
queryset
.
model
model
=
queryset
.
model
fields
=
filter_fields
fields
=
filter_fields
order_by
=
True
return
AutoFilterSet
return
AutoFilterSet
return
None
return
None
...
...
tests/test_filters.py
View file @
f4e02446
...
@@ -408,16 +408,61 @@ class SearchFilterTests(TestCase):
...
@@ -408,16 +408,61 @@ class SearchFilterTests(TestCase):
)
)
class
OrdringFilterModel
(
models
.
Model
):
class
Ord
e
ringFilterModel
(
models
.
Model
):
title
=
models
.
CharField
(
max_length
=
20
)
title
=
models
.
CharField
(
max_length
=
20
)
text
=
models
.
CharField
(
max_length
=
100
)
text
=
models
.
CharField
(
max_length
=
100
)
class
OrderingFilterRelatedModel
(
models
.
Model
):
class
OrderingFilterRelatedModel
(
models
.
Model
):
related_object
=
models
.
ForeignKey
(
OrdringFilterModel
,
related_object
=
models
.
ForeignKey
(
Ord
e
ringFilterModel
,
related_name
=
"relateds"
)
related_name
=
"relateds"
)
class
DjangoFilterOrderingModel
(
models
.
Model
):
date
=
models
.
DateField
()
text
=
models
.
CharField
(
max_length
=
10
)
class
Meta
:
ordering
=
[
'-date'
]
class
DjangoFilterOrderingTests
(
TestCase
):
def
setUp
(
self
):
data
=
[{
'date'
:
datetime
.
date
(
2012
,
10
,
8
),
'text'
:
'abc'
},
{
'date'
:
datetime
.
date
(
2013
,
10
,
8
),
'text'
:
'bcd'
},
{
'date'
:
datetime
.
date
(
2014
,
10
,
8
),
'text'
:
'cde'
}]
for
d
in
data
:
DjangoFilterOrderingModel
.
objects
.
create
(
**
d
)
def
test_default_ordering
(
self
):
class
DjangoFilterOrderingView
(
generics
.
ListAPIView
):
model
=
DjangoFilterOrderingModel
filter_backends
=
(
filters
.
DjangoFilterBackend
,)
filter_fields
=
[
'text'
]
ordering
=
(
'-date'
,)
view
=
DjangoFilterOrderingView
.
as_view
()
request
=
factory
.
get
(
'/'
)
response
=
view
(
request
)
self
.
assertEqual
(
response
.
data
,
[
{
'id'
:
3
,
'date'
:
datetime
.
date
(
2014
,
10
,
8
),
'text'
:
'cde'
},
{
'id'
:
2
,
'date'
:
datetime
.
date
(
2013
,
10
,
8
),
'text'
:
'bcd'
},
{
'id'
:
1
,
'date'
:
datetime
.
date
(
2012
,
10
,
8
),
'text'
:
'abc'
}
]
)
class
OrderingFilterTests
(
TestCase
):
class
OrderingFilterTests
(
TestCase
):
def
setUp
(
self
):
def
setUp
(
self
):
# Sequence of title/text is:
# Sequence of title/text is:
...
@@ -436,11 +481,11 @@ class OrderingFilterTests(TestCase):
...
@@ -436,11 +481,11 @@ class OrderingFilterTests(TestCase):
chr
(
idx
+
ord
(
'b'
))
+
chr
(
idx
+
ord
(
'b'
))
+
chr
(
idx
+
ord
(
'c'
))
chr
(
idx
+
ord
(
'c'
))
)
)
OrdringFilterModel
(
title
=
title
,
text
=
text
)
.
save
()
Ord
e
ringFilterModel
(
title
=
title
,
text
=
text
)
.
save
()
def
test_ordering
(
self
):
def
test_ordering
(
self
):
class
OrderingListView
(
generics
.
ListAPIView
):
class
OrderingListView
(
generics
.
ListAPIView
):
model
=
OrdringFilterModel
model
=
Ord
e
ringFilterModel
filter_backends
=
(
filters
.
OrderingFilter
,)
filter_backends
=
(
filters
.
OrderingFilter
,)
ordering
=
(
'title'
,)
ordering
=
(
'title'
,)
ordering_fields
=
(
'text'
,)
ordering_fields
=
(
'text'
,)
...
@@ -459,7 +504,7 @@ class OrderingFilterTests(TestCase):
...
@@ -459,7 +504,7 @@ class OrderingFilterTests(TestCase):
def
test_reverse_ordering
(
self
):
def
test_reverse_ordering
(
self
):
class
OrderingListView
(
generics
.
ListAPIView
):
class
OrderingListView
(
generics
.
ListAPIView
):
model
=
OrdringFilterModel
model
=
Ord
e
ringFilterModel
filter_backends
=
(
filters
.
OrderingFilter
,)
filter_backends
=
(
filters
.
OrderingFilter
,)
ordering
=
(
'title'
,)
ordering
=
(
'title'
,)
ordering_fields
=
(
'text'
,)
ordering_fields
=
(
'text'
,)
...
@@ -478,7 +523,7 @@ class OrderingFilterTests(TestCase):
...
@@ -478,7 +523,7 @@ class OrderingFilterTests(TestCase):
def
test_incorrectfield_ordering
(
self
):
def
test_incorrectfield_ordering
(
self
):
class
OrderingListView
(
generics
.
ListAPIView
):
class
OrderingListView
(
generics
.
ListAPIView
):
model
=
OrdringFilterModel
model
=
Ord
e
ringFilterModel
filter_backends
=
(
filters
.
OrderingFilter
,)
filter_backends
=
(
filters
.
OrderingFilter
,)
ordering
=
(
'title'
,)
ordering
=
(
'title'
,)
ordering_fields
=
(
'text'
,)
ordering_fields
=
(
'text'
,)
...
@@ -497,7 +542,7 @@ class OrderingFilterTests(TestCase):
...
@@ -497,7 +542,7 @@ class OrderingFilterTests(TestCase):
def
test_default_ordering
(
self
):
def
test_default_ordering
(
self
):
class
OrderingListView
(
generics
.
ListAPIView
):
class
OrderingListView
(
generics
.
ListAPIView
):
model
=
OrdringFilterModel
model
=
Ord
e
ringFilterModel
filter_backends
=
(
filters
.
OrderingFilter
,)
filter_backends
=
(
filters
.
OrderingFilter
,)
ordering
=
(
'title'
,)
ordering
=
(
'title'
,)
oredering_fields
=
(
'text'
,)
oredering_fields
=
(
'text'
,)
...
@@ -516,7 +561,7 @@ class OrderingFilterTests(TestCase):
...
@@ -516,7 +561,7 @@ class OrderingFilterTests(TestCase):
def
test_default_ordering_using_string
(
self
):
def
test_default_ordering_using_string
(
self
):
class
OrderingListView
(
generics
.
ListAPIView
):
class
OrderingListView
(
generics
.
ListAPIView
):
model
=
OrdringFilterModel
model
=
Ord
e
ringFilterModel
filter_backends
=
(
filters
.
OrderingFilter
,)
filter_backends
=
(
filters
.
OrderingFilter
,)
ordering
=
'title'
ordering
=
'title'
ordering_fields
=
(
'text'
,)
ordering_fields
=
(
'text'
,)
...
@@ -536,7 +581,7 @@ class OrderingFilterTests(TestCase):
...
@@ -536,7 +581,7 @@ class OrderingFilterTests(TestCase):
def
test_ordering_by_aggregate_field
(
self
):
def
test_ordering_by_aggregate_field
(
self
):
# create some related models to aggregate order by
# create some related models to aggregate order by
num_objs
=
[
2
,
5
,
3
]
num_objs
=
[
2
,
5
,
3
]
for
obj
,
num_relateds
in
zip
(
OrdringFilterModel
.
objects
.
all
(),
for
obj
,
num_relateds
in
zip
(
Ord
e
ringFilterModel
.
objects
.
all
(),
num_objs
):
num_objs
):
for
_
in
range
(
num_relateds
):
for
_
in
range
(
num_relateds
):
new_related
=
OrderingFilterRelatedModel
(
new_related
=
OrderingFilterRelatedModel
(
...
@@ -545,11 +590,11 @@ class OrderingFilterTests(TestCase):
...
@@ -545,11 +590,11 @@ class OrderingFilterTests(TestCase):
new_related
.
save
()
new_related
.
save
()
class
OrderingListView
(
generics
.
ListAPIView
):
class
OrderingListView
(
generics
.
ListAPIView
):
model
=
OrdringFilterModel
model
=
Ord
e
ringFilterModel
filter_backends
=
(
filters
.
OrderingFilter
,)
filter_backends
=
(
filters
.
OrderingFilter
,)
ordering
=
'title'
ordering
=
'title'
ordering_fields
=
'__all__'
ordering_fields
=
'__all__'
queryset
=
OrdringFilterModel
.
objects
.
all
()
.
annotate
(
queryset
=
Ord
e
ringFilterModel
.
objects
.
all
()
.
annotate
(
models
.
Count
(
"relateds"
))
models
.
Count
(
"relateds"
))
view
=
OrderingListView
.
as_view
()
view
=
OrderingListView
.
as_view
()
...
@@ -567,7 +612,7 @@ class OrderingFilterTests(TestCase):
...
@@ -567,7 +612,7 @@ class OrderingFilterTests(TestCase):
def
test_ordering_with_nonstandard_ordering_param
(
self
):
def
test_ordering_with_nonstandard_ordering_param
(
self
):
with
temporary_setting
(
'ORDERING_PARAM'
,
'order'
,
filters
):
with
temporary_setting
(
'ORDERING_PARAM'
,
'order'
,
filters
):
class
OrderingListView
(
generics
.
ListAPIView
):
class
OrderingListView
(
generics
.
ListAPIView
):
model
=
OrdringFilterModel
model
=
Ord
e
ringFilterModel
filter_backends
=
(
filters
.
OrderingFilter
,)
filter_backends
=
(
filters
.
OrderingFilter
,)
ordering
=
(
'title'
,)
ordering
=
(
'title'
,)
ordering_fields
=
(
'text'
,)
ordering_fields
=
(
'text'
,)
...
...
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