Search code examples
django-rest-frameworkdjango-filter

Django rest framework multi searching


everyone. I tried understand search. I have url path('quiz/all/', QuizListView.as_view()), View :

class QuizListView(generics.ListAPIView):
    queryset = Quiz.objects.all()
    serializer_class = QuizDetailSerializer
    search_fields = ('description', 'title',)
    filterset_fields = ['title', 'description',]

(method1)If I use search, for example /api/v1/quiz/all/?search=QI got all instances where title or description contains 'Q' (method2)I can search /api/v1/quiz/all/?title=Q&description=d I got a instance which has exact title and description.

(method3)But I want to get list of all instances where title contains one value and description contains other value. For example, I want to write /api/v1/quiz/all/?title=Q&description=d and get list where title contains Q and description contains d.

  • Quiz1(title=Q, description=d)
    Quiz2(title=Test, description=dd)
    Quiz3(title=NewQ, description=Test_d)

  • For (method1,/api/v1/quiz/all/?search=Q) I got Quiz1, Quiz2, Quiz3

  • For (method2,/api/v1/quiz/all/?title=Q&description=d) I got Quiz1

  • For (method3,/api/v1/quiz/all/?title=Q&description=d) I would like to get Quiz1 and Quiz3 (because they contain Q for title and d for description)

Thanks.


Solution

  • You'll need to create a custom FilterSet class and use the contains or icontains (if you want case insensitive) because the default is using exact and that's why you don't get back the result that you want. See docs here and here

    # filters.py
    
    class QuizFilter(django_filters.FilterSet):
        class Meta:
            model = Quiz
            fields = {
                'title': ['contains'],  # or icontains
                'description': ['contains'],  # or icontains
            }
    
    # views.py
    from django_filters.rest_framework import DjangoFilterBackend
    from .filters import QuizFilter
    
    class QuizListView(generics.ListAPIView):
        queryset = Quiz.objects.all()
        serializer_class = QuizDetailSerializer
        filter_backends = (DjangoFilterBackend, )  # add here other filters backends
        filterset_class = QuizFilter