Skip to content

Commit 8527a2c

Browse files
committed
Merge pull request encode#3316 from purple-sunrise/iregexp_search
Regex search option
2 parents f601c6c + f0782b9 commit 8527a2c

File tree

3 files changed

+20
-0
lines changed

3 files changed

+20
-0
lines changed

docs/api-guide/filtering.md

+1
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ The search behavior may be restricted by prepending various characters to the `s
260260
* '^' Starts-with search.
261261
* '=' Exact matches.
262262
* '@' Full-text search. (Currently only supported Django's MySQL backend.)
263+
* '$' Regex search.
263264

264265
For example:
265266

rest_framework/filters.py

+2
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ def construct_search(self, field_name):
9494
return "%s__iexact" % field_name[1:]
9595
elif field_name.startswith('@'):
9696
return "%s__search" % field_name[1:]
97+
if field_name.startswith('$'):
98+
return "%s__iregex" % field_name[1:]
9799
else:
98100
return "%s__icontains" % field_name
99101

tests/test_filters.py

+17
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,23 @@ class SearchListView(generics.ListAPIView):
407407
]
408408
)
409409

410+
def test_regexp_search(self):
411+
class SearchListView(generics.ListAPIView):
412+
queryset = SearchFilterModel.objects.all()
413+
serializer_class = SearchFilterSerializer
414+
filter_backends = (filters.SearchFilter,)
415+
search_fields = ('$title', '$text')
416+
417+
view = SearchListView.as_view()
418+
request = factory.get('/', {'search': 'z{2} ^b'})
419+
response = view(request)
420+
self.assertEqual(
421+
response.data,
422+
[
423+
{'id': 2, 'title': 'zz', 'text': 'bcd'}
424+
]
425+
)
426+
410427
def test_search_with_nonstandard_search_param(self):
411428
with override_settings(REST_FRAMEWORK={'SEARCH_PARAM': 'query'}):
412429
reload_module(filters)

0 commit comments

Comments
 (0)