| 
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  | 
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  | 
@@ -304,6 +305,35 @@ class SearchListView(generics.ListAPIView):  | 
304 | 305 |         assert len(response.data) == 1  | 
305 | 306 | 
 
  | 
306 | 307 | 
 
  | 
 | 308 | +class SearchFilterAnnotatedSerializer(serializers.ModelSerializer):  | 
 | 309 | +    title_text = serializers.CharField()  | 
 | 310 | + | 
 | 311 | +    class Meta:  | 
 | 312 | +        model = SearchFilterModel  | 
 | 313 | +        fields = ('title', 'text', 'title_text')  | 
 | 314 | + | 
 | 315 | + | 
 | 316 | +class SearchFilterAnnotatedFieldTests(TestCase):  | 
 | 317 | +    @classmethod  | 
 | 318 | +    def setUpTestData(cls):  | 
 | 319 | +        SearchFilterModel.objects.create(title='abc', text='def')  | 
 | 320 | +        SearchFilterModel.objects.create(title='ghi', text='jkl')  | 
 | 321 | + | 
 | 322 | +    def test_search_in_annotated_field(self):  | 
 | 323 | +        class SearchListView(generics.ListAPIView):  | 
 | 324 | +            queryset = SearchFilterModel.objects.annotate(  | 
 | 325 | +                title_text=Concat(models.F('title'), models.F('text'), output_field=models.CharField())).all()  | 
 | 326 | +            serializer_class = SearchFilterAnnotatedSerializer  | 
 | 327 | +            filter_backends = (filters.SearchFilter,)  | 
 | 328 | +            search_fields = ('title_text',)  | 
 | 329 | + | 
 | 330 | +        view = SearchListView.as_view()  | 
 | 331 | +        request = factory.get('/', {'search': 'abcdef'})  | 
 | 332 | +        response = view(request)  | 
 | 333 | +        assert len(response.data) == 1  | 
 | 334 | +        assert response.data[0]['title_text'] == 'abcdef'  | 
 | 335 | + | 
 | 336 | + | 
307 | 337 | class OrderingFilterModel(models.Model):  | 
308 | 338 |     title = models.CharField(max_length=20, verbose_name='verbose title')  | 
309 | 339 |     text = models.CharField(max_length=100)  | 
 | 
0 commit comments