python - 在 Django API 视图中创建自定义搜索过滤器
问题描述
我有我的自定义 API 视图,我想在此视图中使用搜索过滤器,但通用过滤器不起作用,所以我想创建自定义的过滤器,但它不起作用,我不知道问题出在哪里。
看法
class TaskIndexAPIView(APIView):
filter_backends = (CustomSearchFilter,)
search_fields = ('name', 'description', 'user__username')
def get_queryset(self):
return Task.objects.all()
def get(self, request):
tasks = self.get_queryset()
for i in tasks:
if i.date <= date.today():
i.delayed = 'This task is delayed'
i.save()
else:
i.delayed = ''
i.save()
serializer = IndexSerializer(tasks, many=True)
return Response(serializer.data)
我的自定义搜索过滤器
搜索过滤器
class CustomSearchFilter(filters.SearchFilter):
def get_search_fields(self, view, request):
if request.get_queryset.get('name', 'user'):
return ['name', 'user']
return super(CustomSearchFilter, self).get_search_fields(view, request)
解决方案
APIView
在您的上下文中,和之间的区别generic view
是,通用视图有一个称为filter_queryset()
处理过滤和搜索操作的方法。
因此,在您看来,我们需要包括相同的内容。
class TaskIndexAPIView(APIView):
filter_backends = (CustomSearchFilter,)
search_fields = ('name', 'description', 'user__username')
def filter_queryset(self, queryset):
"""
Given a queryset, filter it with whichever filter backend is in use.
You are unlikely to want to override this method, although you may need
to call it either from a list view, or from a custom `get_object`
method if you want to apply the configured filtering backend to the
default queryset.
"""
for backend in list(self.filter_backends):
queryset = backend().filter_queryset(self.request, queryset, self)
return queryset
def get_queryset(self):
return Task.objects.all()
def get(self, request):
the_filtered_qs = self.filter_queryset(self.get_queryset())
tasks = the_filtered_qs
for i in tasks:
if i.date <= date.today():
i.delayed = 'This task is delayed'
i.save()
else:
i.delayed = ''
i.save()
serializer = IndexSerializer(tasks, many=True)
return Response(serializer.data)
您将获得过滤后的查询集
the_filtered_qs = self.filter_queryset(self.get_queryset())
推荐阅读
- sorting - CSV 删除第二列中的重复项而不删除第一行
- javascript - Firebase 云函数:“状态”:“INVALID_ARGUMENT”
- ytdl - ytdl() 错误:“url”参数必须是字符串类型。接收类型未定义
- sql-server - 如何查询 SQL Server XML 列中的文本
- c++ - C++ 使用 strlen 和 strcpy 编译问题
- python - Pandas 从单个时间列创建具有年月日的多索引数据透视表
- php - MySQL Query() 的问题
- intellij-idea - 生成菜单中缺少生成 Ant 生成选项
- .net - 在 .NET 4.7.1 Webapi 中使用 HttpClientFactory
- javascript - 电子应用程序中的fancybox3关闭按钮问题