Skip to content

Commit 272a752

Browse files
mindblightsliverc
authored andcommitted
DjangoFilterBackend.get_filterset_kwargs doesn't modify data dict while iterating (#580)
1 parent 30ca94b commit 272a752

File tree

3 files changed

+17
-2
lines changed

3 files changed

+17
-2
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ any parts of the framework not mentioned in the documentation should generally b
1313
### Fixed
1414

1515
* Avoid exception when trying to include skipped relationship
16+
* Don't swallow `filter[]` params when there are several
1617

1718
## [2.7.0] - 2019-01-14
1819

example/tests/test_filters.py

+15
Original file line numberDiff line numberDiff line change
@@ -503,3 +503,18 @@ def test_param_duplicate(self):
503503
dja_response = response.json()
504504
self.assertEqual(dja_response['errors'][0]['detail'],
505505
"repeated query parameter not allowed: sort")
506+
507+
def test_many_params(self):
508+
"""
509+
Test that filter params aren't ignored when many params are present
510+
"""
511+
response = self.client.get(self.url,
512+
data={'filter[headline.regex]': '^A',
513+
'filter[body_text.regex]': '^IN',
514+
'filter[blog.name]': 'ANTB',
515+
'page[size]': 3})
516+
self.assertEqual(response.status_code, 200,
517+
msg=response.content.decode("utf-8"))
518+
dja_response = response.json()
519+
self.assertEqual(len(dja_response['data']), 1)
520+
self.assertEqual(dja_response['data'][0]['id'], '1')

rest_framework_json_api/django_filters/backends.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
from django_filters.rest_framework import DjangoFilterBackend
55
from rest_framework.exceptions import ValidationError
66
from rest_framework.settings import api_settings
7-
87
from rest_framework_json_api.utils import format_value
98

109

@@ -102,7 +101,7 @@ def get_filterset_kwargs(self, request, queryset, view):
102101
filter_keys = []
103102
# rewrite filter[field] query params to make DjangoFilterBackend work.
104103
data = request.query_params.copy()
105-
for qp, val in data.items():
104+
for qp, val in request.query_params.items():
106105
m = self.filter_regex.match(qp)
107106
if m and (not m.groupdict()['assoc'] or
108107
m.groupdict()['ldelim'] != '[' or m.groupdict()['rdelim'] != ']'):

0 commit comments

Comments
 (0)