|
5 | 5 | import pytest
|
6 | 6 | from django.core.exceptions import ImproperlyConfigured
|
7 | 7 | from django.db import models
|
| 8 | +from django.db.models.functions import Concat, Upper |
8 | 9 | from django.test import TestCase
|
9 | 10 | from django.test.utils import override_settings
|
10 | 11 | from django.utils.six.moves import reload_module
|
@@ -329,6 +330,38 @@ class SearchListView(generics.ListAPIView):
|
329 | 330 | assert len(response.data) == 1
|
330 | 331 |
|
331 | 332 |
|
| 333 | +class SearchFilterAnnotatedSerializer(serializers.ModelSerializer): |
| 334 | + title_text = serializers.CharField() |
| 335 | + |
| 336 | + class Meta: |
| 337 | + model = SearchFilterModel |
| 338 | + fields = ('title', 'text', 'title_text') |
| 339 | + |
| 340 | + |
| 341 | +class SearchFilterAnnotatedFieldTests(TestCase): |
| 342 | + @classmethod |
| 343 | + def setUpTestData(cls): |
| 344 | + SearchFilterModel.objects.create(title='abc', text='def') |
| 345 | + SearchFilterModel.objects.create(title='ghi', text='jkl') |
| 346 | + |
| 347 | + def test_search_in_annotated_field(self): |
| 348 | + class SearchListView(generics.ListAPIView): |
| 349 | + queryset = SearchFilterModel.objects.annotate( |
| 350 | + title_text=Upper( |
| 351 | + Concat(models.F('title'), models.F('text')) |
| 352 | + ) |
| 353 | + ).all() |
| 354 | + serializer_class = SearchFilterAnnotatedSerializer |
| 355 | + filter_backends = (filters.SearchFilter,) |
| 356 | + search_fields = ('title_text',) |
| 357 | + |
| 358 | + view = SearchListView.as_view() |
| 359 | + request = factory.get('/', {'search': 'ABCDEF'}) |
| 360 | + response = view(request) |
| 361 | + assert len(response.data) == 1 |
| 362 | + assert response.data[0]['title_text'] == 'ABCDEF' |
| 363 | + |
| 364 | + |
332 | 365 | class OrderingFilterModel(models.Model):
|
333 | 366 | title = models.CharField(max_length=20, verbose_name='verbose title')
|
334 | 367 | text = models.CharField(max_length=100)
|
|
0 commit comments