django rest框架搜索过滤所有字段

时间:2015-06-09 12:27:19

标签: django rest search filter django-rest-framework

我有一个基本模型视图集,我可以处理顺序,分页和搜索功能。 当我有适当的过滤后端,我可以设置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
如果设置search_fields='__all__',则

drf生成search_fields失败 有没有其他方法可以通过所有功能提供搜索?

1 个答案:

答案 0 :(得分:3)

不可能,反正也不是个好主意..

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

您还可以使用不同的字段类型,这些字段类型不会支持基于文本的搜索。

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

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