Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

django rest framework search filter all fields

I have a base model view set which i can handle order, pagination and search functionalities. When i have proper filter backends, i can set ordering_fields, search_fields but my question is that: like i can set ordering_fields = '__all__' isn't it possible to set search_fields for all?

I've looked for deep inside filtering mechanism and came here:

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 fails on generate search_fields if it is set search_fields='__all__' Is there any other way to provide search by all functionality?

like image 937
apollo629 Avatar asked Apr 20 '26 05:04

apollo629


1 Answers

Not possible and it's not a good idea anyway..

One reason is because there can be different types of searching query (__istartswith, __iexact, etc.), which you can set up for each field name.

You can also have different field types which won't necessary support text-base search.

More important - it will result in much slower queries, while you keep adding new fields into the model. It's always better to be explicit, so you know which fields are actually searched upon.

If your searching feature relies on multiple fields, maybe you should consider haystack or look for any other dedicated searching engine.

like image 167
mariodev Avatar answered Apr 22 '26 22:04

mariodev



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!