Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django-filter, how to make multiple fields search? (with django-filter!)

How can I make multiple fields search with Django-filter from model like:

class Location(models.Model):
    loc = models.CharField(max_length=100, blank=True)
    loc_mansioned = models.CharField(max_length=100, blank=True)
    loc_country = models.CharField(max_length=100, blank=True)
    loc_modern = models.CharField(max_length=100, blank=True)

I need one input field on my website, that can search over all fields of Location model

like image 223
Medevin Avatar asked Jul 30 '19 11:07

Medevin


People also ask

What is the purpose of filter () method in django?

The filter() method is used to filter you search, and allows you to return only the rows that matches the search term.

Can you filter a QuerySet?

Working with Filter Easily the most important method when working with Django models and the underlying QuerySets is the filter() method, which allows you to generate a QuerySet of objects that match a particular set of filtered parameters.


2 Answers

You can probably create a custom filter and do something like this:

from django.db.models import Q
import django_filters


class LocationFilter(django_filters.FilterSet):
    q = django_filters.CharFilter(method='my_custom_filter',label="Search")

    class Meta:
        model = Location
        fields = ['q']

    def my_custom_filter(self, queryset, name, value):
        return queryset.filter(
            Q(loc__icontains=value) | Q(loc_mansioned__icontains=value) | Q(loc_country__icontains=value) | Q(loc_modern__icontains=value)
        )

This would filter by any of of those fields. You can replace the icontains with whatever you want.

like image 180
Dalvtor Avatar answered Sep 28 '22 08:09

Dalvtor


This is perfect. I'm trying to do a dynamic filter, with a switch to get one more field in the search if checked. Something like this:

def my_custom_filter(self, queryset, name, value):
    return Reference.objects.filter(
        Q(ref_title__icontains=value))

def my_custom_filter_with_description(self, queryset, name, value):
    return Reference.objects.filter(
        Q(ref_title__icontains=value) | Q(complete_description__icontains=value))

But I have no clue how to link the switch to the class

like image 42
Grégoire Rouet Avatar answered Sep 28 '22 10:09

Grégoire Rouet