Django 休息框架多搜索
Django rest framework multi searching
大家。我试着理解搜索。
我有 url 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
我得到了一个具有准确标题和描述的实例。
(method3)但我想获取标题包含一个值且描述包含其他值的所有实例的列表。例如,我想写 /api/v1/quiz/all/?title=Q&description=d
并获取标题包含 Q 且描述包含 d.
的列表
测验 1(标题=Q,描述=d)
测验2(标题=测试,描述=dd)
Quiz3(title=NewQ, description=Test_d)
对于 (method1,/api/v1/quiz/all/?search=Q) 我得到了 Quiz1, Quiz2, Quiz3
For (method2,/api/v1/quiz/all/?title=Q&description=d) 我得到了Quiz1
For (method3,/api/v1/quiz/all/?title=Q&description=d) 我想
获取 Quiz1 和 Quiz3(因为它们包含标题 Q
和描述 d
)
谢谢。
您需要创建自定义 FilterSet
class 并使用 contains
或 icontains
(如果您不区分大小写),因为默认使用 exact
这就是为什么你得不到你想要的结果的原因。请参阅文档 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
大家。我试着理解搜索。
我有 url 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
我得到了一个具有准确标题和描述的实例。
(method3)但我想获取标题包含一个值且描述包含其他值的所有实例的列表。例如,我想写 /api/v1/quiz/all/?title=Q&description=d
并获取标题包含 Q 且描述包含 d.
测验 1(标题=Q,描述=d)
测验2(标题=测试,描述=dd)
Quiz3(title=NewQ, description=Test_d)对于 (method1,/api/v1/quiz/all/?search=Q) 我得到了 Quiz1, Quiz2, Quiz3
For (method2,/api/v1/quiz/all/?title=Q&description=d) 我得到了Quiz1
For (method3,/api/v1/quiz/all/?title=Q&description=d) 我想 获取 Quiz1 和 Quiz3(因为它们包含标题
Q
和描述d
)
谢谢。
您需要创建自定义 FilterSet
class 并使用 contains
或 icontains
(如果您不区分大小写),因为默认使用 exact
这就是为什么你得不到你想要的结果的原因。请参阅文档 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