首页 > 解决方案 > Django rest框架多搜索

问题描述

每个人。我试着理解搜索。我有网址 path('quiz/all/', QuizListView.as_view()), 查看:

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

(方法1)如果我使用搜索,例如,/api/v1/quiz/all/?search=Q我得到所有标题或描述包含“Q”的实例(方法2)我可以搜索/api/v1/quiz/all/?title=Q&description=d我得到一个具有确切标题和描述的实例。

(方法3)但我想获取所有实例的列表,其中标题包含一个值,描述包含另一个值。例如,我想编写/api/v1/quiz/all/?title=Q&description=d并获取标题包含 Q 和描述包含 d 的列表。

谢谢。

标签: django-rest-frameworkdjango-filter

解决方案


您需要创建一个自定义FilterSet类并使用containsor icontains(如果您希望不区分大小写),因为默认使用的是 using exact,这就是您无法获得所需结果的原因。在此处此处查看文档

# 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

推荐阅读