django rest framework 搜索过滤所有字段

标签 django rest search filter django-rest-framework

我有一个基本模型 View 集,可以处理订单、分页和搜索功能。 当我有适当的过滤器后端时,我可以设置 ordering_fields、search_fields 但我的问题是: 就像我可以设置 ordering_fields = '__all__' 是不是可以为所有人设置 search_fields?

我一直在寻找深层过滤机制并来到这里:

def filter_queryset(self, request, queryset, view):
    search_fields = getattr(view, 'search_fields', None)

    if not search_fields:
        return queryset

    orm_lookups = [self.construct_search(six.text_type(search_field))
                   for search_field in search_fields]

    for search_term in self.get_search_terms(request):
        or_queries = [models.Q(**{orm_lookup: search_term})
                      for orm_lookup in orm_lookups]
        queryset = queryset.filter(reduce(operator.or_, or_queries))

    return queryset

如果设置了 drf search_fields='__all__',则 drf 无法生成 search_fields 有没有其他方法可以提供按所有功能进行搜索?

最佳答案

不可能,而且这也不是一个好主意..

一个原因是因为可以有不同类型的搜索查询(__istartswith__iexact 等),您可以为每个字段名称设置它们。

您还可以有不同的字段类型,这些字段类型不一定支持基于文本的搜索。

更重要的是 - 它会导致查询速度变慢,同时您不断向模型中添加新字段。明确说明总是更好,这样您就知道实际搜索了哪些字段。

如果您的搜索功能依赖于多个字段,也许您应该考虑 haystack或寻找任何其他专用搜索引擎。

关于django rest framework 搜索过滤所有字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30732042/

相关文章:

search - 如何为 crossdomain.xml 文件定义自定义位置?

python - 跳过 html5lib 中视频的清理

用于外键的 Django Tastypie apply_filter

python - django外键无法分配必须是实例

AngularJS使用$http服务进行跨域请求

在 Gmail API 中搜索具有特定 threadId 的邮件

django - 使用 django-proxy 的示例?

java - 从另一个端点调用 REST 端点

rest - Grails POST请求字符集编码

php - 如何根据单词优先级的相关性对mysql搜索结果进行排序