Add unaccent to SearchFilter

This commit is contained in:
Marcelo Galigniana 2024-04-15 10:50:12 -03:00
parent f593f5752c
commit f195dec501
3 changed files with 23 additions and 1 deletions

View File

@ -230,6 +230,7 @@ The search behavior may be specified by prefixing field names in `search_fields`
| `$` | `iregex` | Regex search. |
| `@` | `search` | Full-text search (Currently only supported Django's [PostgreSQL backend][postgres-search]). |
| None | `icontains` | Contains search (Default). |
| `&` | `unaccent` | Accent-insensitive search. (Currently only supported Django's [PostgreSQL backend][postgres-lookups]). |
For example:
@ -370,3 +371,4 @@ The [djangorestframework-word-filter][django-rest-framework-word-search-filter]
[HStoreField]: https://docs.djangoproject.com/en/3.0/ref/contrib/postgres/fields/#hstorefield
[JSONField]: https://docs.djangoproject.com/en/3.0/ref/contrib/postgres/fields/#jsonfield
[postgres-search]: https://docs.djangoproject.com/en/stable/ref/contrib/postgres/search/
[postgres-lookups]: https://docs.djangoproject.com/en/stable/ref/contrib/postgres/lookups/#unaccent

View File

@ -68,6 +68,7 @@ class SearchFilter(BaseFilterBackend):
'=': 'iexact',
'@': 'search',
'$': 'iregex',
'&': 'unaccent',
}
search_title = _('Search')
search_description = _('A search term.')

View File

@ -10,7 +10,7 @@ from django.test import SimpleTestCase, TestCase
from django.test.utils import override_settings
from rest_framework import filters, generics, serializers
from rest_framework.compat import coreschema
from rest_framework.compat import coreschema, postgres_fields
from rest_framework.exceptions import ValidationError
from rest_framework.test import APIRequestFactory
@ -305,6 +305,25 @@ class SearchFilterTests(TestCase):
]
@pytest.mark.skipif(not postgres_fields, reason='psycopg2 is not installed')
class SearchPostgreSQLFilterTests(TestCase):
def test_unaccent_search(self):
class SearchListView(generics.ListAPIView):
queryset = SearchFilterModel.objects.all()
serializer_class = SearchFilterSerializer
filter_backends = (filters.SearchFilter,)
search_fields = ('title', '&text')
obj = SearchFilterModel.objects.create(title='Accent títle', text='Accent téxt')
view = SearchListView.as_view()
request = factory.get('/', {'search': 'accent text'})
response = view(request)
assert response.data == [
{'id': obj.id, 'title': 'Accent títle', 'text': 'Accent téxt'}
]
class AttributeModel(models.Model):
label = models.CharField(max_length=32)